使用Python

时间:2018-01-20 17:56:19

标签: python pandas csv

我必须在远程服务器上处理csv文件,因此需要很长时间。

我的csv文件是8个第一行包含一种格式为key : value的标头。然后,在第九行,列索引格式化为通常的csv文件。

由于访问该文件很长,我只想打开一次,但我不知道如何操作。 实际上,根据我的理解,pd.read_csv()仅将文件作为输入,而不仅仅是其内容。 所以这就是我现在所处的位置:

import pandas as pd

with open(r'myFile.csv', "r", encoding = "utf-8") as file:

    header = file.readlines()[:8]

    metaData = [value.split(':') for value in header]
    metaData = {value[0].strip() : value[1].strip() for value in metaData}

    data = pd.read_csv(file, sep=';', header = 8)

以及相关的错误消息:

EmptyDataError: No columns to parse from file

使用示例输入csv文件进行编辑:

key1:value1
key2:value2
key3:value3
key4:value4
key5:value5
key6:value6
key7:value7
key8:value8
column1;column2;column3
values;values;values
values;values;values
values;values;values
values;values;values

4 个答案:

答案 0 :(得分:2)

目前,您的代码在检索标头时会读取整个文件。之后,文件指针位于文件的末尾,因此pandas不会从文件中获取更多内容。诀窍是只在您想要标题时读取前8行,然后将部分读取的文件指针传递给pd.read_csv,这将读取其余部分。这是对您的代码的简单更改:

将pandas导入为pd

with open(r'myFile.csv', "r", encoding = "utf-8") as file:

    header = [file.readline() for x in range(8)]

    metaData = [value.split(':') for value in header]
    metaData = {value[0].strip() : value[1].strip() for value in metaData}

    data = pd.read_csv(file, sep=';')

答案 1 :(得分:1)

您可以通过构造函数创建嵌套的list并创建DataFrame

with open(r'myFile.csv', "r", encoding = "utf-8") as file:

    #get iterators for all lines
    data = file.readlines()

    #filter first 8 for metadata 
    metaData = [value.split(':') for value in data[:8]]
    metaData = {value[0].strip() : value[1].strip() for value in metaData}

    #read lines from 8+ lines
    datas = [value.strip().split(';') for value in data[8:]]
    print (datas)
    [['column1', 'column2', 'column3'], 
     ['values', 'values', 'values'],
     ['values', 'values', 'values'], 
     ['values', 'values', 'values'], 
     ['values', 'values', 'values']]

    df = pd.DataFrame(datas[1:], columns=datas[0])
    print (df)
      column1 column2 column3
    0  values  values  values
    1  values  values  values
    2  values  values  values
    3  values  values  values

答案 2 :(得分:0)

必须在问题中遗漏某些内容。你能不能使用以下内容?

import pandas as pd

df = pd.read_csv('maxime.csv', sep=';', skiprows=7, header=1)
print (df)

结果是:

  column1 column2 column3
0  values  values  values
1  values  values  values
2  values  values  values
3  values  values  values

答案 3 :(得分:0)

我刚发现的另一种方法,因为我需要在第9行检查列的存在:

import pandas as pd

with open(r'myFile.csv', "r", encoding = "utf-8") as file:

    init = file.tell()
    header = file.readlines()[:9]
    file.seek(init)

    metaData = [value.split(':') for value in header]
    metaData = {value[0].strip() : value[1].strip() for value in metaData}

    data = pd.read_csv(file, sep=';', header = 8)