Skip to main content
 首页 » 编程设计

python之读取带有不完整标题的 CSV 文件

2025年05月04日9over140

我以前没有在 python 中使用过 csv 模块,但它似乎是一个很好的工具,可以满足我的需要。

我面临的问题是我的 csv-file 看起来有点奇怪。 (一开始很难注意到)

请参阅下面的示例以了解我的意思:

A|B|C|D|x|F|G|x|H 
1||2||3|4||5|6 
1||2||3|4||5|6 
1||2||3|4||5|6 
1||2||3|4||5|6 

上面有一些索引(比如column-x)应该读作Dx和Gx。 D 列 和G 列 是空列。

所以我需要的是,当 csv 处理 header 时,它应该创建像 Dx 和 Gx 这样的 header ,而忽略 D 和G 列并从 x 列 中取值。

(我尝试先使用以下代码按原样读取文件并对其进行后期处理,但这是不可能的,因为列名 x 始终相同,并且 csv. DictReader 似乎丢弃了重复的列名)

with open('myCSV.log') as csvFile: 
    reader = csv.DictReader(csvFile, dialect='pipes') 
    for row in reader: 
        print row 

这可以通过 dialect 或其他配置 csv-module 的奇特方式来实现,还是我必须自己解析?

请您参考如下方法:

使用pandas :

import pandas as pd 
print pd.read_csv('test.csv',sep='|') 

输出:

   A   B  C   D  x  F   G  x.1  H 
0  1 NaN  2 NaN  3  4 NaN    5  6 
1  1 NaN  2 NaN  3  4 NaN    5  6 
2  1 NaN  2 NaN  3  4 NaN    5  6 
3  1 NaN  2 NaN  3  4 NaN    5  6 

如果需要,您可以使用 to_dict() 方法将其转换为字典:

{'A': {0: 1, 1: 1, 2: 1, 3: 1}, 
 'B': {0: nan, 1: nan, 2: nan, 3: nan}, 
 'C': {0: 2, 1: 2, 2: 2, 3: 2}, 
 'D': {0: nan, 1: nan, 2: nan, 3: nan}, 
 'F': {0: 4, 1: 4, 2: 4, 3: 4}, 
 'G': {0: nan, 1: nan, 2: nan, 3: nan}, 
 'H': {0: 6, 1: 6, 2: 6, 3: 6}, 
 'x': {0: 3, 1: 3, 2: 3, 3: 3}, 
 'x.1': {0: 5, 1: 5, 2: 5, 3: 5}} 

编辑: 如果您需要为列指定特定名称,您可以这样做:

import pandas as pd 
df = pd.read_csv('test.csv',sep='|') 
df.columns = [df.columns[index-1]+'x' if 'x' in name  
              else name for index,name in enumerate(df.columns)] 
print df 
 
   A   B  C   D  Dx  F   G  Gx  H 
0  1 NaN  2 NaN   3  4 NaN   5  6 
1  1 NaN  2 NaN   3  4 NaN   5  6 
2  1 NaN  2 NaN   3  4 NaN   5  6 
3  1 NaN  2 NaN   3  4 NaN   5  6 

如果你想丢失空列:

print df.dropna(axis=1,how='all') 
 
   A  C  Dx  F  Gx  H 
0  1  2   3  4   5  6 
1  1  2   3  4   5  6 
2  1  2   3  4   5  6 
3  1  2   3  4   5  6