【问题标题】:Python/Django- Save csv file data with messy rowsPython/Django - 保存带有杂乱行的 csv 文件数据
【发布时间】:2017-04-29 14:46:09
【问题描述】:

我有一个 csv 文件,其结构如下:

A, 10
B, 11
C, 8
D, 12
A, 21
B, 7
D, 22
D, 15
C, 111
D, 50
A, 41
B, 32
C, 19
D, 11

我想读取整个文件,并将数据保存在第二列,如果该行是 A、B、C、D 格式。 我有一个清单:

my_list = [A, B, C, D]

我检查每4行,如果它是my_list格式,然后读取并保存到数据库中:

with open('csv_file.csv', 'rb') as csvfile:
        the_file = csv.reader(csvfile.read().splitlines())

        for idx, row in enumerate(islice(zip(*[the_file]*4), 100)):
            my_model = Django_model()
            if row[0][0] == my_list[0]:
                if row[0][0] == my_list[0] and row[1][0] == my_list[1] and \
                    row[2][0] == my_list[2] and row[3][0] == my_list[3]:
                    my_model.a_field = row[0][1]
                    my_model.b_field = row[1][1]
                    my_model.c_field = row[2][1]
                    my_model.d_field = row[3][1]
                    my_model.save()

事实上,当且仅当row 的结构与my_list 相同时,它才有效。但是当它到达杂乱的部分(A、B、D、D、C、D)时,它不会正确读取行,因此会跳过很多行。

问题是,我怎样才能跳到下一个有趣的行(遵循my_list 格式)并阅读它?同时将跳过的行保存在另一个列表中?

我听说 Pandas 可以提供帮助,但我浏览了文档,但找不到解决此案例的方法。

【问题讨论】:

  • 现在检查。您可以提取所需的模式和不需要的模式。

标签: python django pandas django-models csv-import


【解决方案1】:

您可以像这样提取模式和对应的值:

import pandas as pd
import re

df = pd.read_csv('/home/yusuf/Desktop/c1', header=None, names=['c1','c2'])
l1=[]
for a in re.finditer('ABCD', ''.join(df.c1.tolist())):
    l1.append(range(a.start(),a.end()))
l2 = [b for a in l1 for b in a]
print df[df.index.isin(l2)], '\n'
print df[~df.index.isin(l2)]

输出:

   c1  c2
0   A  10
1   B  11
2   C   8
3   D  12
10  A  41
11  B  32
12  C  19
13  D  11

  c1   c2
4  A   21
5  B    7
6  D   22
7  D   15
8  C  111
9  D   50

【讨论】:

  • 感谢您的回复。似乎它正在完成这项工作,但不知何故,前两行被跳过了。我得到一个列表:C D A B C D,另一个是:A B A B D D C D。你知道可能是什么原因吗?
  • 我得看看你的代码。我提供的代码适用于您在问题中包含的数据。如果您更改数据或代码,则可能无法正常工作。
  • 我所做的唯一更改是:for a in re.finditer(''.join(my_list), ''.join(df.c1.tolist()))。和my_list = ['A', 'B', 'C', 'D']。这会是个问题吗?
  • 不,没关系。如果 csv 保持不变,该代码将适用于该更改。
  • 再次感谢您的解决方案,我正在尝试调试,我想知道这是做什么的:l2 = [b for a in l1 for b in a],因为一些好的A B C D 行出现在跳过的行中也列出来。我必须补充一点,我有一个相对较大的 csv 文件,其中包含近 100 万行/行。
猜你喜欢
  • 2018-09-11
  • 2018-06-09
  • 1970-01-01
  • 2022-10-17
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
相关资源
最近更新 更多