首页 > 解决方案 > 使用 Pandas read_csv() 处理开头以“sep=”开头的 .csv 文件

问题描述

当您使用记事本打开时,我有一个带有制表符分隔文件的 .csv 文件,如下所示(您在记事本中看到的空间实际上是制表符 (\t):

sep = 
Time Val1 Val2
00:01 10 20

"sep=" 是否存在以便 excel 可以正确读取 .csv 文件。问题是,当您尝试使用 read_csv 打开它时,它会返回一个名为“s”的列的单列数据框。如果我用 Excel 打开文件并双击第一列宽度以具有自动宽度,保存并关闭,则文件正确格式化为逗号分隔。当您使用记事本打开文件时,文件开头不再有“sep=”,然后 Pandas 会正确读取所有列和值。

在有人问之前: 1. 我尝试使用以下方法删除第一行:

with open(csvFileName, mode="rU") as infile:
with open(csvFileName, mode="r") as infile:

要么删除第一行,要么将 "\t" 替换为 "," 并将其写回另一个文件,但都不起作用。2.我也尝试检测和使用不同的编码方案,所以编码不是问题。3.该文件使用lineterminator = \n,我使用该参数读取 4.我使用skiprows=0跳过第一行,没有工作 5.我试图将header = 1其指向它具有标题的行,并设置sep=\t,它读取的数量列和行正确,但列名是“UnnamedXYZ”并且值都是NaNs

任何想法表示赞赏!

标签: pythonpandascsv

解决方案


如果要使用第一行中的分隔符值来解析 csv:

来自 data.csv 的输入:

  sep = ,
  Year Dec Jan
     1  50  60
     2  25  50
     3  30  30
     4  40  20
     5  10  10

将文件读入列表,并保存到数据框中:

x = []
sep = ''
with open(filename) as f:
    for i, line in enumerate(f):
        if i == 0:
            sep = line.rstrip()[-1]
        if i > 0:
            x.append(line.rstrip().split(','))
x = pd.DataFrame(data=x[1:], columns=x[0])

X

  Year Dec Jan
0    1  50  60
1    2  25  50
2    3  30  30
3    4  40  20
4    5  10  10

如果没有分隔符,或者分隔符字段为空,或者分隔符在 csv 的后续行中不存在,您应该添加进一步的逻辑来处理。


推荐阅读