使用Python解析CSV /制表符分隔的文本文件

时间:2011-10-21 23:19:45

标签: python parsing csv dictionary

我目前有一个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 “成为我的钥匙,”史密斯“是各自的价值。

有什么建议吗?源文件是.txt文件,其中的条目以制表符分隔。 感谢

澄清:

为了澄清,到目前为止,我已尝试过以下方法: -

import csv

mydict = {:}
f = open("myfile", 'rt')
reader = csv.reader(f)
    for row in reader:
        print row

以上只是一次打印出所有内容。我确实尝试了“读取器中的行(7)”,但这返回了一个错误。然后我研究了它,并在下面进行了一次但是它既不起作用:

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 个答案:

答案 0 :(得分:50)

首先将文本转换为列表列表。这将解析解析部分:

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
 ...

答案 1 :(得分:6)

虽然所提供的其他解决方案没有任何问题,但您可以使用python的优秀图书馆熊猫简化并大大提升您的解决方案。

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 collumns you dont 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")

答案 2 :(得分:3)

如果文件很大,您可能不想立即将其完全加载到内存中。这种方法避免了这种情况。 (当然,用它来制作一个字典仍然可以占用一些RAM,但它保证比原始文件小。)

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