【问题标题】:parsing a tab-separated file in Python在 Python 中解析制表符分隔的文件
【发布时间】:2012-06-19 00:54:57
【问题描述】:

我正在尝试在 Python 中解析一个制表符分隔的文件,其中一个数字将 k 个制表符与行的开头分开,应该放置到第 k 个数组中。

除了逐行读取并执行简单解决方案会执行的所有明显处理之外,是否有内置函数或更好的方法来执行此操作?

【问题讨论】:

  • 有时很容易忘记,但习惯上接受您问题的答案..
  • @Bob 不要让我们悬而未决。

标签: python tabs io


【解决方案1】:

您可以使用the csv module 轻松解析制表符分隔值文件。

import csv

with open("tab-separated-values") as tsv:
    for line in csv.reader(tsv, dialect="excel-tab"): #You can also use delimiter="\t" rather than giving a dialect.
        ... 

其中line 是当前行上每次迭代的值的列表。

编辑:如下所示,如果您想按列而不是按行阅读,那么最好的办法是使用 zip() 内置函数:

with open("tab-separated-values") as tsv:
    for column in zip(*[line for line in csv.reader(tsv, dialect="excel-tab")]):
        ...

【讨论】:

  • 只要缺少一个元素,就会有两个连续的选项卡。这行得通吗?
  • @Bob 你为什么不试试看? (但是是的,它会的)。
  • @Lattyware:您将“文件”用作变量名是不允许的...... ;)
  • @martineau:在所有要重新绑定的默认内置名称中,file 问题最少,尤其是。因为它甚至在 3 中都不存在。当你从我冰冷的死手上撬开它时,你们都可以拥有“for file in files:`!;^)
  • @martineau 我是 Python 3.x 的人,所以我有时会忘记这是在 2.x 中粉碎file。好点,但是。已编辑。
【解决方案2】:

我认为当前的任何答案都不能真正做到你所说的你想要的。 (更正:我现在看到@Gareth Latty / @Lattyware 已将我的答案合并到他自己的答案中,作为接近结尾的“编辑”。)

无论如何,这是我的看法:

假设这些是输入文件中的制表符分隔值:

1   2   3   4   5
6   7   8   9   10
11  12  13  14  15
16  17  18  19  20

然后这个:

with open("tab-separated-values.txt") as inp:
    print( list(zip(*(line.strip().split('\t') for line in inp))) )

会产生以下结果:

[('1', '6', '11', '16'), 
 ('2', '7', '12', '17'), 
 ('3', '8', '13', '18'), 
 ('4', '9', '14', '19'), 
 ('5', '10', '15', '20')]

如您所见,它将每行的第 k 个元素放入第 k 个数组中。

【讨论】:

    【解决方案3】:

    像这样:

    >>> s='1\t2\t3\t4\t5'
    >>> [x for x in s.split('\t')]
    ['1', '2', '3', '4', '5']
    

    对于文件:

    # create test file:
    >>> with open('tabs.txt','w') as o:
    ...    s='\n'.join(['\t'.join(map(str,range(i,i+10))) for i in [0,10,20,30]])
    ...    print >>o, s
    
    #read that file:
    >>> with open('tabs.txt','r') as f:
    ...    LoL=[x.strip().split('\t') for x in f]
    ... 
    >>> LoL
    [['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], 
     ['10', '11', '12', '13', '14', '15', '16', '17', '18', '19'], 
     ['20', '21', '22', '23', '24', '25', '26', '27', '28', '29'], 
     ['30', '31', '32', '33', '34', '35', '36', '37', '38', '39']]
    >>> LoL[2][3]
    23
    

    如果你想转置输入:

    >>> with open('tabs.txt','r') as f:
    ...    LoT=zip(*(line.strip().split('\t') for line in f))
    ... 
    >>> LoT[2][3]
    '32'
    

    或者(更好)在默认分发中使用 csv 模块...

    【讨论】:

    • 在 Python 中,创建一个空列表然后附加值是一种反模式。这就是列表推导的用途。
    • @Lattyware:我个人认为第一种形式并不难读,但你是对的——嵌套列表理解可能更符合 Pythonic。已编辑。
    • @drewk: [x.split('\t') for f.split('\n')] 毫无意义。没有x 并且文件对象没有split() 方法。
    • @martineau:为什么要使用 csv 模块的完美例子,不是吗?错字已修复。我测试过了
    • @drewk:嗯,没那么多……恕我直言,很可能是后者。 ;)
    【解决方案4】:

    您可以通过 python pandas pd.read_csv ('file_name.tsv', sep='\t') 轻松做到这一点


    [注意:需要用这个命令安装pandaspip install pandas]

    【讨论】:

      猜你喜欢
      • 2015-09-13
      • 1970-01-01
      • 2013-10-16
      • 2015-02-14
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多