Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.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文件解析并使其dict_Python_Csv - Fatal编程技术网

Python csv文件解析并使其dict

Python csv文件解析并使其dict,python,csv,Python,Csv,我有一个.csv文件试图在dict中创建它。我主要尝试了pandas和csv.DictReader,但直到现在我可以用DictReader打印数据(不是以我想要的方式)。 所以主要的问题是这个文件 header;data (1 column) 大约50行,之后它会像 header1;header2;header3;header4 在第50行和第50行+ data1;data2;data3;data4 etc.. 这就是我现在的代码。 谢谢您的帮助。您不能为此使用DictReader,因为

我有一个.csv文件试图在dict中创建它。我主要尝试了pandas和csv.DictReader,但直到现在我可以用DictReader打印数据(不是以我想要的方式)。 所以主要的问题是这个文件

header;data (1 column)
大约50行,之后它会像

header1;header2;header3;header4 
在第50行和第50行+

data1;data2;data3;data4 etc..
这就是我现在的代码。
谢谢您的帮助。

您不能为此使用
DictReader
,因为它要求所有行具有相同的字段

使用
csv.reader
并检查它返回的行的长度。当长度更改时,将其视为新的标头

希望文件中没有相邻的部分具有相同数量的字段,但标题不同。当节发生更改时,脚本将很难检测到

data = []
with open(filename, 'r', encoding='utf-16') as f:
    r = csv.reader(f, delimiter=';')

    # process first 52 rows in format header;data
    for _ in range(52):
        row = next(r)
        data.append({row[0]: row[1]})
    # rest of file is a header row followed by variable number of data rows
    header = next(r)
    for row in r:
        if len(row) != len(header): # new header
            header = row
            continue
        d = dict(zip(header, row))
        data.append(d)

我不认为<代码> DictReader <代码>允许你在文件中间更改字段名称。是的,你是对的,因为我忘了提到在某些行中有2个以上的值。它从2个值开始,然后在大约50行之后变为4个值。它从2个值开始,有些行有3个值,然后从第52-252行变为4个值。我已经将它更改为更一般的值:每当字段数改变时,这是一个新的标题。尝试将其关闭…尝试修复它,因为这样它将始终将第1行的标题作为标题。
data = []
with open(filename, 'r', encoding='utf-16') as f:
    r = csv.reader(f, delimiter=';')

    # process first 52 rows in format header;data
    for _ in range(52):
        row = next(r)
        data.append({row[0]: row[1]})
    # rest of file is a header row followed by variable number of data rows
    header = next(r)
    for row in r:
        if len(row) != len(header): # new header
            header = row
            continue
        d = dict(zip(header, row))
        data.append(d)