如何在Python中解析混合的CSV文件?

3

我正在处理一个类似于这个的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。

6个回答

6

您可以从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)

4

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']]

1

对于每一行,只使用 str.split 怎么样?

items = line.split(";")

如果items列表中的第一项是foo,则执行一项操作;如果是bar,则执行另一项操作。


0

这些行不同的事实对于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()

0

从你的问题中并不清楚你实际想要实现什么,但我不确定你在这里需要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

0

这个怎么样:

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的类,它们将其余的行单元格作为参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接