Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 读取非结构化CSV_Python_Csv - Fatal编程技术网

Python 读取非结构化CSV

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

我想解析一个给定的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(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 '"'