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

Posted

技术标签:

【中文标题】用 Python 解析 CSV / 制表符分隔的 txt 文件【英文标题】:Parsing CSV / tab-delimited txt file with Python 【发布时间】:2011-12-12 23:11:57 【问题描述】:

我目前有一个 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”是相应的数据,然后在我的字典中添加另一个条目,使用“2938495”跳转到第 15 行" 是我的关键,而 "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 - 原始问题已编辑以包含我迄今为止尝试过的内容 “从第 8 行开始”与“A7”不一致,“6 位整数”与“DDEFEEF”不一致 -- 请编辑您的问题。 @John Machin - A7 不是我要从中提取数据的单元格,它是 A8。 A7 中的数据只是为了举例说明我的 CSV 文件中存在哪些其他数据。由于它不是 6 位整数,因此将被忽略。谢谢 @thefragileomen:尝试阅读您自己的问题:“我希望从 A7 (DDEFEEF) 中提取值作为我字典中的键,而“FEFEFEFE”是相应的数据”——正如我所说,不一致。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

虽然其他解决方案没有任何问题,但您可以通过使用 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")

【讨论】:

【参考方案3】:

如果文件很大,您可能不想一次将其完全加载到内存中。这种方法避免了这种情况。 (当然,用它制作一个 dict 仍然会占用一些 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 编辑为一种更易读的方法,不需要三个级别的大括号​​即可工作;)

以上是关于用 Python 解析 CSV / 制表符分隔的 txt 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 和 pandas 将错误创建的大型 csv 文件转换为制表符分隔文件

用 0 填充空格/制表符分隔的空列

在 Ruby 中解析制表符分隔文件的最佳方法是啥?

.Tsv . Csv 文件

tsv与csv文件

python读写csv文件