【问题标题】:parsing text file without splitting up multi-word names解析文本文件而不拆分多词名称
【发布时间】:2014-03-13 15:57:29
【问题描述】:

我正在尝试使用文本文件从 xml 获取数字输出并将其转换为名称,然后将其写入单独的文本文件。我的问题是名称有时包含空格,我不知道如何处理。

该程序在线访问多个 txt 和 xml 文件,其中项目由参考号引用。它将这些文件中的信息与我设置的标准进行比较,然后将参考号添加到列表中。我想要做的是将此参考编号转换为相关名称。我有一个包含参考编号和名称的文本文件,并且想使用 index() 函数查找参考编号,然后将关联的名称写入文本文件。我无法解析它,以便我可以进行转换。我的问题是列表是这样写的:

number    name\n
14        apple\n
27        anjou pear\n
36        asian pear\n
7645      langsat\n

所以如果我只使用 .split() 我最终会拆分一些名称。我尝试用 '\n' 替换数字和名称之间的空格并将其拆分,但这也不起作用。如果我用 ' , ' 替换空格并拆分它,我最终会得到包括下一行编号 ['apple\n15'] 的名称,它将文本作为两行写入,并让我遇到无法拆分的相同问题它在空白处...

有什么建议吗???

我现在已经按照下面的建议实现了 Dict() 函数,它可以工作 接受我仍然在名称末尾有 \n...

ttn = dict()
f=open('typeid2.txt', 'r')
    for line in f:
    number, name = line.split(None,1)
    ttn[number] = name

如果我打电话给ttn['14'],我会得到'apple\n'

【问题讨论】:

  • 使用 ttn[number].strip() 更好,但将 line.split(None,1) 更改为 line.strip().split(None,1)

标签: python regex parsing text python-3.x


【解决方案1】:

正则表达式非常强大和有用,但要习惯使用它们需要一些权限。我建议您坚持使用 split ,这里是 split 的帮助信息,它描述了如何使用 maxsplit 值来限制拆分的数量。

Help on built-in function split:

split(...)
S.split([sep [,maxsplit]]) -> list of strings

Return a list of the words in the string S, using sep as the
delimiter string.  If maxsplit is given, at most maxsplit
splits are done. If sep is not specified or is None, any
whitespace string is a separator and empty strings are removed
from the result.

所以对于您的代码,假设您有一些要拆分的行

mytest = dict()
for each_line in data:
    number, name = line.split(None,1)
    mytest[number] = name

会返回类似的东西

我的测试 {'27':'anjou pear','7645':'langsat','number':'name','36':'asian pear','14':'apple'} 访问帮助假设您有一些字符串 mystring 然后只需键入

help(mystring.split)

我的第一次尝试和这次的不同是由于下面的评论。在我的第一次尝试中,名称值上的前导空格被保留了,但是通过使用 None,所有空白字符在第一次拆分时都被删除了,因此这更具体到您要查找的内容。

【讨论】:

  • 使用split(None,1) 自动修剪值之间的空白。
  • 所以基本上我会用它来创建一个新列表,然后索引到该列表?另外,您能否展示如何保存该列表而不是打印它?我有超过 8000 个条目,所以将它们全部打印出来有点令人讨厌……我不想举个例子,但我显然不喜欢使用评论系统……
  • @user3391121 我只是打印它以证明该方法有效。您的下一个问题是如何以持久的方式保存它。这并不难,但使用的方法需要解决您的用例。但是,根据此处的指南,您应该选择其中一个答案作为最能满足您需求的答案,然后再问另一个问题。但是,我认为您不需要提出问题 - 在此处搜索 [python] [dictionary] save 并查看其中一些答案是否会指导您。我看了一眼,第一对看起来他们满足了你的需求
  • 好吧,我的问题是“我要做的是将此参考编号转换为相关名称”。这几乎回答了我的问题,如果我可以将它保存到一个新文件中,然后我可以索引。我试图用 'g.write(number, name)' ('g=open('newfile.txt', 'w')' 之前的这个) 替换 'print(number, name)' 并且我没有收到任何错误但也没有文字。 'g.write(str(number, name))' 是一样的。另外,我不得不将其更改为'for line in f:'。我使用的是 3.3,所以我认为这就是语法差异的原因
  • 我把它放在字典里,如果列表很大,字典比列表有很大的优势。一方面,您可以避免在每次查找时遍历列表。
【解决方案2】:

您可以为此使用re.findall()

input = "number    name\n14        apple\n27        anjou pear\n36        asian pear\n7645      langsat\n"
print re.findall("(\w+)\s+(.+)", input)

输出:

[('number', 'name'), ('14', 'apple'), ('27', 'anjou pear'), ('36', 'asian pear'), ('7645', 'langsat')]

【讨论】:

  • 这正是你所说的,似乎已经摆脱了 \n 但我不知道如何在它中搜索 ID 号并将其与名称相关联。我想我将不得不再次拆分它,但它现在是一个元组,所以我遇到了麻烦。关于完成这个还有更多的建议吗??? (名称数字组合现在是元组中的单个项目,所以如果我说 t[1] 它将返回 ('14', 'apple')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
相关资源
最近更新 更多