在python中解析管道分隔文件

Posted

技术标签:

【中文标题】在python中解析管道分隔文件【英文标题】:Parsing a pipe-delimited file in Python 【发布时间】:2013-04-04 02:01:10 【问题描述】:

我正在尝试解析管道分隔文件并将值传递到列表中,以便稍后我可以从列表中打印选择性值。

文件如下:

name|age|address|phone|||||||||||..etc

它有 100 多列。

【问题讨论】:

一个好的问题将有一个示例代码以及您在尝试运行代码时遇到的任何错误。 @jwodder:不管是什么原因,它似乎奏效了:这个问题得到了两个有效的答案,而另一个没有得到并被自动删除。尽管分数很差,但投票重新开放。 我很所以很高兴关闭这个问题的尝试在第二次尝试中失败了! 【参考方案1】:

如果您要解析一个非常简单的文件,在实际字段值中不包含任何| 字符,您可以使用split

fileHandle = open('file', 'r')

for line in fileHandle:
    fields = line.split('|')

    print(fields[0]) # prints the first fields value
    print(fields[1]) # prints the second fields value

fileHandle.close()

编辑:解析表格数据的一种更可靠的方法是将csv 库用作mentioned below。

【讨论】:

我使用了拆分字符串方法,但它只从第一个拆分列(名称)打印“n”。 如果你真的将我的代码复制并粘贴到一个文本文件中并运行它,你会发现它可以工作。也许你可以分享一些你的代码,以便我们看看出了什么问题? with open("abc.txt","r" ) as infile: data = infile.read() fields = data.split('|') print(data[0])跨度> 如果其中一个字段中有管道,则此方法将不起作用。使用实际的 CSV 库会更好地管理。【参考方案2】:
import pandas as pd

pd.read_csv(filename,sep="|")

这会将文件存储在数据框中。对于每一列,您可以应用条件来选择要打印的所需值。执行时间很短。我尝试了 111047 行。

【讨论】:

【参考方案3】:

使用csv library。

首先,注册你的方言:

import csv
csv.register_dialect('piper', delimiter='|', quoting=csv.QUOTE_NONE)

然后,在文件上使用您的方言:

with open(myfile, "rb") as csvfile:
    for row in csv.DictReader(csvfile, dialect='piper'):
        print row['name']

【讨论】:

我很感谢提出的解决方案,但我遇到了一些小问题。错误“迭代器应该返回字符串,而不是字节(您是否以文本模式打开文件?)”通过将 encoding='utf-8' 添加到 open() i> 语句。第二个问题是使用 mode='r' 而不是解决方案中给出的 mode='rb' 解决的。

以上是关于在python中解析管道分隔文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中使用管道分隔符拆分文本文件,然后使列数等于属性值的数量?

解析字符串中管道分隔符内的文本[重复]

为啥 String.split 需要转义管道分隔符?

将管道分隔的字符串解析为列?

如何使用 Python 使用管道分隔符拆分文本文件,然后根据条件选择列?

WSO2 EI:在csv文件中添加管道分隔符