使用分隔符读取制表符分隔的文件

问题描述 投票:0回答:3

我正在使用以下内容来读取制表符分隔的文件。文件中有三列,但当我仅打印列标题时,第一列被忽略。我如何也包含第一列?

f = open("/tmp/data.txt")
for l in f.readlines():
    print l.strip().split("\t")
    break
    f.close()

输出:

['session_id\t', '\tevent_id_concat'] 

第一个列名称是

id
,它没有打印在上面的数组中。

print l
产生以下结果:

'id\tsession_id\tevent_id_concat\r\n'

输出:

['id\t', '\tevent_id_concat'] 
python
3个回答
19
投票

我建议使用 csv 模块。如果您想读取以 CSV 格式存储的表格结构(制表符/空格/其他分隔符),它很容易使用并且最适合。

模块文档提供了很好的示例,其中最简单的用法是:

import csv with open('/tmp/data.txt', 'r') as f: reader = csv.reader(f) for row in reader: print row
每一行都是一个列表,如果您想进行基于索引的操作,这非常有用。

如果您想更改分隔符,可以使用一个关键字,但我通常对预定义的方言感到满意,这些方言也可以通过关键字定义。

import csv with open('/tmp/data.txt', 'r') as f: reader = csv.reader(f, dialect='excel', delimiter='\t') for row in reader: print row
我不确定这是否能解决您的问题,但如果错误仍然存在,使用详细模块将确保您的文件有问题,而不是您的代码有问题。


7
投票
它应该可以工作,但最好使用“with”:

with open('/tmp/data.txt') as f: for l in f: print l.strip().split("\t")

如果没有,那么您的文件可能不具有所需的格式。


0
投票
我发布这个答案是为了看看我是否能得到对这种方法的一些批评。这个问题是一个简单的旧 Python 2 场景,所以我希望以下可能是更新的答案,以及这里其他问题的尚未提及的替代方案。

csv

模块用于读取从Excel文档生成的CSV文件,但是当它更改为来自类似源的
制表符分隔文件时,我不明白为什么需要模块。

def read_rows(filename: str) -> list[dict[str, str]]: """Read TAB delimited file with header row and return rows.""" with open(filename, newline="", encoding="utf-8") as tabfile: fieldnames = [field.strip() for field in next(tabfile).split("\t")] return [ dict(zip(fieldnames, (field.strip() for field in line.split("\t")))) for line in tabfile.readlines() ] rows = read_rows("/home/user/in.txt") # rows is now a list of dict keyed on the field names from the first row
我很感兴趣为什么有人会为此任务导入 

csv

 模块。

鉴于该文件仅使用制表符作为分隔符,并且假设文件的每一行上都有相同数量的制表符,我根本看不出有任何理由不像这样简单地吞掉文件并保存导入

csv

 模块。

使用 CSV 文件,尤其是 MS Excel CSV 文件,存在许多陷阱和特殊情况,使用

csv

 模块进行保护是明智的。但一般情况下,制表符在内容中很少见,尤其是使用制表键更改字段的网页内容。在使用可靠的制表符分隔符时,经常会遇到这样的情况:上面提到的先决条件得到了保证,但麻烦地使用 
csv
 似乎是浪费精力和额外的代码行。

请参阅

Python open

 文档
以了解 open
 调用的关键字参数。

© www.soinside.com 2019 - 2024. All rights reserved.