[英]Reading a CSV-file with uncomplete headers
我以前没有在python
使用过csv module
,但它似乎是满足我的需求的好工具。
我面临的问题是我的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处理标头时,它应该创建标头,如Dx和Gx,而忽略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
理想方式来实现这一点,还是我必须自己解析?
使用熊猫 :
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()
方法将其转换为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
我认为读取文件并进行后处理确实是一种方法。 只是不要使用DictReader
:
with open('myCSV.log') as csvFile:
for row in csv.reader(csvFile, delimiter='|'):
print row
['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']
您有九个标题和九个列,除了双头标题之外,.csv我没有看到任何问题。 您可以在DictReader中覆盖字段名称,以重命名它们。 另外,如果要将列“ D”重命名为“ Dx”,则可以使用此参数来完成。 。
import csv
from pprint import pprint
with open('testfile.csv') as csvFile:
reader = csv.DictReader(csvFile, fieldnames = ['A','B','C','meh','Dx','F','moe','Gx','H'], delimiter = '|' )
for row in reader:
pprint(row)
在这里似乎不需要使用方言! 这是我的测试输出,第一行现在是标题。
{'A': 'A',
'B': 'B',
'C': 'C',
'Dx': 'x',
'F': 'F',
'Gx': 'x',
'H': 'H',
'meh': 'D',
'moe': 'G'}
{'A': '1',
'B': '',
'C': '2',
'Dx': '3',
'F': '4',
'Gx': '5',
'H': '6',
'meh': '',
'moe': ''}
....
from StringIO import StringIO
import csv
with open('test.csv') as f:
lines = f.read().split('\n')
line_0 = lines[0].split('|')
lines[0] = '|'.join(line_0[i-1] if 'x' in n else n for i,n in
enumerate(line_0))
reader = csv.DictReader(StringIO('\n'.join(lines)),delimiter = '|' )
for row in reader:
print row
出:
{'A': '1', 'C': '2', 'B': '', 'D': '3', 'G': '5', 'F': '4', 'H': '6'}
{'A': '1', 'C': '2', 'B': '', 'D': '3', 'G': '5', 'F': '4', 'H': '6'}
{'A': '1', 'C': '2', 'B': '', 'D': '3', 'G': '5', 'F': '4', 'H': '6'}
{'A': '1', 'C': '2', 'B': '', 'D': '3', 'G': '5', 'F': '4', 'H': '6'}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.