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

38

我有一个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

@jdigital - 原始问题已编辑,包含我迄今为止尝试过的内容 - thefragileomen
“从第8行开始”与“A7”不一致,“6位整数”与“DDEFEEF”不一致 - 请编辑您的问题。 - John Machin
@John Machin - A7不是我想要提取数据的单元格,而是A8。A7中的数据只是为了给您展示我的CSV文件中存在的其他数据的示例。由于它不是一个6位整数,因此应将其忽略。谢谢。 - thefragileomen
@thefragileomen:试着读一下你自己的问题:“我想从A7(DDEFEEF)中提取值作为我的字典中的键,而“FEFEFEFE”则是相应的数据”--正如我所说,不一致。 - John Machin
3个回答

74

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

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

10
尽管其他解决方案没有问题,但是您可以通过使用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")

1
从pandas 0.21.0版本开始,pandas.DataFrame.from_csv()已被弃用。可以使用pandas.read_csv()代替。 - BLT

4

如果文件很大,您可能不想一次性将其全部加载到内存中。这种方法可以避免这种情况。(当然,将其转换为字典仍然可能占用一些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


感谢回复。我尝试实现上述内容并在最后一行遇到“ValueError”-“字典更新序列元素#0的长度为1;需要2”。有什么建议吗? - thefragileomen
@thefragileomen 进行了编辑,使其更易读,不需要三层括号才能工作 ;) - kojiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接