我必须在远程服务器上处理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
答案 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)