用Python解析CSV/制表符分隔的文本文件
我现在有一个CSV文件,打开后在Excel里一共有5列。对我来说,只有A列和C列的数据是有用的,其他列的数据都不重要。
我想从第8行开始,每隔7行提取一次数据(也就是第8行、第15行、第22行、第29行、第36行等等),用Python 2.7创建一个字典。在这个字典里,A列的数据将作为键(是一个6位数的整数),而C列的数据则是这个键对应的值。我试着把这个想法简单描述了一下,但格式可能不太好:
A B C D
1 CDCDCDCD
2 VDDBDDB
3
4
5
6
7 DDEFEEF FEFEFEFE
8 123456 JONES
9
10
11
12
13
14
15 293849 SMITH
根据上面的描述,我想把A7的值(DDEFEEF)作为字典的一个键,而“FEFEFEFE”则是这个键对应的值。接着,我会跳到第15行,把“2938495”作为另一个键,而“Smith”则是它对应的值。
有没有什么建议?源文件是一个.txt文件,里面的内容是用制表符分隔的。
补充说明:
为了更清楚,我到目前为止尝试了以下方法:
import csv
mydict = {:}
f = open("myfile", 'rt')
reader = csv.reader(f)
for row in reader:
print row
上面的代码只是逐行打印出所有内容。我试过用“for row(7) in reader”,但这返回了一个错误。然后我查了一下资料,尝试了下面的代码,但也没有成功:
import csv
from itertools import islice
entries = csv.reader(open("myfile", 'rb'))
mydict = {'key' : 'value'}
for i in xrange(6):
mydict['i(0)] = 'I(2) # integers representing columns
range = islice(entries,6)
for entry in range:
mydict[entries(0) = entries(2)] # integers representing columns
3 个回答
如果文件很大,你可能不想一次性把它全部加载到内存中。这种方法可以避免这个问题。(当然,把它变成一个字典可能还是会占用一些内存,但肯定会比原始文件小。)
my_dict = {}
for i, line in enumerate(file):
if (i - 8) % 7:
continue
k, v = line.split("\t")[:3:2]
my_dict[k] = v
补充:之前我不太确定为什么提到extend
,我其实是想说update
。
虽然其他的解决方案也没什么问题,但你可以通过使用Python的一个很棒的库——pandas,来简化并大大提升你的解决方案。
Pandas是一个用于处理数据的Python库,很多数据科学家都喜欢用它。
Pandas提供了一个简单的CSV接口,可以用来读取和解析文件,这样你就可以得到一个字典的列表,每个字典代表文件中的一行。字典的键是列名,而值就是每个单元格里的内容。
在你的情况下:
import pandas
def create_dictionary(filename):
my_data = pandas.DataFrame.from_csv(filename, sep='\t', index_col=False)
# Here you can delete the dataframe columns you don't want!
del my_data['B']
del my_data['D']
# ...
# Now you transform the DataFrame to a list of dictionaries
list_of_dicts = [item for item in my_data.T.to_dict().values()]
return list_of_dicts
# Usage:
x = create_dictionary("myfile.csv")
首先,把文本转换成一个列表的列表。这样就能处理解析的部分了:
lol = list(csv.reader(open('text.txt', 'rb'), delimiter='\t'))
接下来的工作可以通过索引查找来完成:
d = dict()
key = lol[6][0] # cell A7
value = lol[6][3] # cell D7
d[key] = value # add the entry to the dictionary
...