[英]How to parse a mixed CSV file in Python?
我正在处理一个类似于这个的 CSV 文件
foo; val1; position1
bar; name1; address1; phone_nbr1
bar; name2; address2; phone_nbr2
foo; val2; position2
bar; name3; address3; phone_nbr3
bar; name4; address4; phone_nbr4
bar; name5; address5; phone_nbr5
bar; name6; address6; phone_nbr6
foo; val3; position3
不用说,我无法修改 CSV。
以foo
行显示的实例与带有bar
线的实例不同(注意它们甚至没有相同数量的字段)
我只需要读取这些数据,无需编写。
我的第一个想法是将文件分成两个临时文件,然后使用csv.DictReader
分别读取每个文件,但是我真的不喜欢这种方法。
有没有更简单的方法来做到这一点? 如果可能的话,我想避免将文件写入磁盘。
作为记录,我在 Solaris 10 机器上使用 Python2.7。
您可以从csv.reader
收集两个不同列表中的记录,具体取决于它们的长度(或用于区分两个流的任何标准):
list1 = []
list2 = []
with open("input.csv", "rb") as f:
for record in csv.reader(f, delimiter=";"):
if len(record) == 3:
list1.append(record)
else:
list2.append(record)
csv.reader()
对此没有问题:
import csv
foo = []
bar = []
with open("test.csv", 'r') as f:
c = csv.reader(f, delimiter = ";")
for row in c:
if row[0] == "foo":
foo.append(row[1:])
elif row[0] == "bar":
bar.append(row[1:])
print(foo)
print(bar)
结果是
[[' val1', ' position1'], [' val2', ' position2'], [' val3', ' position3']]
[[' name1', ' address1', ' phone_nbr1'], [' name2', ' address2', ' phone_nbr2'], [' name3', ' address3', ' phone_nbr3'], [' name4', ' address4', ' phone_nbr4'], [' name5', ' address5', ' phone_nbr5'], [' name6', ' address6', ' phone_nbr6']]
行不同的事实对于csv
模块不是问题,但您必须根据第一个“单元格”以不同方式分析行内容。
代码示例:
with open(input_file, 'rb') as fin:
c = csv.reader(fin)
for line in c:
if line[0] == 'foo':
# do some treatment
elif line[0] == 'bar':
# do something else
c.close()
从您的问题中不清楚您真正想要实现的目标是什么,但我不确定您是否需要这里的 csv 模块。
for row in myfile.readlines():
cols = [r.strip() for r in row.split(';')]
if (cols[0] == "foo"):
# Do something for foo
elif (cols[0] == "bar"):
# Do something for bar
怎么样:
foos = []
bars = []
for line in csv.reader(open("file.csv","rb"), delimiter=";"):
if line[0] == "foo":
foos.append(Foo(line[1], line[2]))
else:
bars.append(Bar(line[1], line[2], line[3]))
假设您有一个Foo
和一个Bar
类,将其余的行单元格作为参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.