Python 读取非结构化CSV
我想解析一个给定的csv文件 "header_1" ; "header_2"; "header_3" "a" ; "b" ; "c" "1" ; "2" ; "3" Some footer text; maybe more.Python 读取非结构化CSV,python,csv,Python,Csv,我想解析一个给定的csv文件 "header_1" ; "header_2"; "header_3" "a" ; "b" ; "c" "1" ; "2" ; "3" Some footer text; maybe more. 是否有一种更智能、更通灵的解决方案,而不检查线路是否为空?一般来说,我更喜欢。您可以使用itertools.takewhile打破您的状况,它创建了一个很好的单行程序: import itertools result = list(itertools.takewhile
是否有一种更智能、更通灵的解决方案,而不检查线路是否为空?一般来说,我更喜欢。您可以使用
itertools.takewhile
打破您的状况,它创建了一个很好的单行程序:
import itertools
result = list(itertools.takewhile(bool,reader))
当行为空时,转换为bool
将产生False
和takewhile
停止在读卡器上迭代
转换到列表
仅用于显示目的。如果只想在行上迭代,则不必进行转换(这样可以避免创建列表)
顺便说一句:您的输入文件有一些额外的空格,这会使读取器失败。在修复它们之后,我使用上面的行:
[['header_1', 'header_2', 'header_3'], ['a', 'b', 'c'], ['1', '2', '3']]
除了使用
break
之外,您还可以使用空列表计算为false
的事实,并使用while循环:
while(row in reader):
result+=[row]
使用代码片段的解决方案
import csv
with open("a.csv") as csv_file:
reader = csv.reader(csv_file, delimiter=";", strict=False)
result = []
#First get everything in list
for row in reader:
result.append(row)
#Filter list only for row with 3 elements.Blank line got ignored also
final = [r for r in result if len(r)==3]
print final
输出:
C:\Users\dinesh\Desktop>python demo.py
[['header_1 ', ' "header_2"', ' "header_3"'], ['a ', ' "b" ', ' "c"'], ['1 ', '"2" ', ' "3"']]
您可以使用发电机,尽管它并不短:
def get_行(路径):
对于csv.reader中的行(打开(路径),分隔符=“;”):
如果行:
生产线
其他:
打破
f=[get_行中的i代表i(“blah.csv”)]
打印f
当我在Python2或Python3下运行您的代码时,我得到一个csv.Error
异常:
File "so1.py", line 7, in <module>
for row in reader:
_csv.Error: ';' expected after '"'
文件“so1.py”,第7行,在
对于读取器中的行:
_csv.Error:';'预期在“之后”
CSV“标准”中的字段分隔符周围不允许有空格。但是,当我将strict
设置为False
时,我得到三个数据行和一个空行,然后输出停止,因为break
语句终止循环的执行。将break
(终止循环)替换为continue
(结束此迭代)给出第四行:[“一些页脚文本”,“可能更多”。]
因此,如果您想处理数据错误,您的测试似乎需要更具体一点-可能只测试三个值,而忽略任何具有不同数字的行?您的意思是只分析包含3个字段的行,对吗?您的解决方案真正困扰您的是什么?由于t他
break
语句。在我看来,这看起来不太像python。因此我很好奇如何找到更好的解决方案。DictReader完成了这项工作!Tat基本上读入一个dict,它的键由可选的fieldnames参数给出,而fieldnames没有给出,csvfile第一行中的值将被用作字段名。因此,空行被省略!您问题中的代码将不会读取您问题中显示的csv文件。\u csv.Error:“;”应在“”
之后。请解决此问题。我建议您更明确地说明什么是“正确”行(例如,包含n
分隔符的每一行,或第一个空行之前的每一行(如果有的话)。然后通过首先筛选这些行(例如,使用生成器表达式)并仅在之后对其进行解析来在代码中反映这一点。但我认为更好。;-)
File "so1.py", line 7, in <module>
for row in reader:
_csv.Error: ';' expected after '"'