2014-03-13 48 views
1

我想用一个文本文件从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']的名称,它将两行文本写入文本,并留下与我无法分割相同的问题它在白色空间...

任何建议???

我现在已经实施的建议波纹管的快译通()函数,它的工作原理接受,我仍然有在名称末尾的\ 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'

+0

使用ttn [number] .strip()更好地改变line.split(None,1)为line.strip()。split(None,1) – PyNEwbie

回答

1

正则表达式是非常强大的,有用的,但它需要很多习惯使用他们提供一些权威。我会建议,而不是你坚持与拆分这里是来自分裂的帮助信息,描述如何使用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 

将返回这样的事情

mytest的 { '27':“安茹梨','7645':'langsat','号码':'名字','36':'亚洲梨','14':'苹果' 访问他LP假设你有一些字符串的myString则只需键入

​​

我第一次尝试之间的区别,这一个是由于下面的评论。在我的第一次尝试中,名称值上的前导空格被保留,但是通过使用None,所有空白字符在第一次拆分时被删除,因此这更具体地针对您正在寻找的内容。

+0

使用'split(None,1)'代替自动修剪值之间的空白。 – tripleee

+0

#triplee谢谢你学到了新的东西 – PyNEwbie

+0

所以基本上我会用这个来创建一个新的列表然后索引到那个列表?另外,你能否展示如何保存该列表而不是打印它?我有超过8000的条目,所以打印他们都会有点讨厌... 我厌倦了做一个例子,但我显然吮吸使用评论系统... – user3391121

1

您可以使用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')] 
+0

这样做的确如你所说的那样,似乎有摆脱了\ n,但我不知道如何搜索它的id号并将其与名称关联。我想我将不得不再次分裂它,但它现在是一个元组,所以我遇到了麻烦。任何更多的建议完成此关闭??? (名字数组合现在是单元内的元组,所以如果我说't [1]'它会返回'('14','apple')') – user3391121