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

38 投票
3 回答
139233 浏览
提问于 2025-04-17 04:47

我现在有一个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 个回答

4

如果文件很大,你可能不想一次性把它全部加载到内存中。这种方法可以避免这个问题。(当然,把它变成一个字典可能还是会占用一些内存,但肯定会比原始文件小。)

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

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

撰写回答