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

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

文件如下:

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

它有 100 多列。

【问题讨论】:

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

标签: python python-3.x parsing csv


【解决方案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' 解决的。
    猜你喜欢
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多