Python/Django- 保存乱行的csv文件数据
Python/Django- Save csv file data with messy rows
我有一个具有以下结构的 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 可以提供帮助,但是我已经查阅了文档,但我找不到解决这个问题的方法。
您可以像这样提取模式和相应的值:
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
我有一个具有以下结构的 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 可以提供帮助,但是我已经查阅了文档,但我找不到解决这个问题的方法。
您可以像这样提取模式和相应的值:
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