从文件中读取并拆分各种分隔符并存储在字典中

时间:2014-11-12 20:31:07

标签: python python-2.7

您好我正在尝试创建一个python程序,分裂各种符号,如;或者,我有一个这样的文本文件:

bobby b ;   1999/3/3
danny d , 1994/7/7

注意间距。我想分解我尝试过的各种符号:

d={}
f = open('names.txt', "r")
for line in f:
    test= re.split(r'\s*[;,.]\s*', line)
    firstName=test[0]
    dateName=test[1] # 

    print firstName, dateName

名字似乎没问题,当我打印名字[0]时,我得到了名字,例如danny d但是当我尝试约会[1]时,我得到一个超出范围的错误。为什么是这样?

4 个答案:

答案 0 :(得分:1)

您向我们展示的代码和数据无法产生您所描述的问题。

但是,我愿意打赌你的实际数据会产生类似的问题。

如果数据中有空行,请考虑会发生什么:

>>> line = ''
>>> test = re.split(r'\s*[;,.]\s*', line)
>>> test
['']
>>> date=test[1]
IndexError: list index out of range

所以,你甚至没有得到你抱怨的date[1]代码(但没有向我们展示)。

答案 1 :(得分:0)

正如abarnert在回答中所说的那样,错误是因为数据中有空行时!

我还建议,如果所有行的格式都是bobby b ; 1999/3/3,其中名字在前导,而日期在尾随,则不需要regex只需split行并选择第一个条目,最后!

>>> s="bobby b ;   1999/3/3"
>>> s.split()
['bobby', 'b', ';', '1999/3/3']
>>> s.split()[0]
'bobby'
>>> s.split()[-1]
'1999/3/3'

因此,对于同样错误的拒绝使用if条件:

with open('names.txt', "r") as f :
 for line in f.readlines():
    if len(line):
      print "name is : " + line.split()[0] 
      print "name is : " + line.split()[-1]

答案 2 :(得分:0)

您可以使用strip()删除空格。

d="""bobby b ;   1999/3/3
danny d , 1994/7/7"""

import re
for line in d.splitlines():
    test= re.split(';|,',line)
    firstName=test[0].strip().split(" ")[1]
    date=test[1].strip()
    print firstName, date

输出:

b 1999/3/3
d 1994/7/7

如果您想获得全名,则无需拆分即可获得姓/名。您还需要映射变量名称< ==>日期,其中名称是唯一的,您可以使用名称作为获取此信息的密钥来获取日期。

import re
D={}
for line in d.splitlines():
    test= re.split(';|,',line)
    firstName=test[0].strip()
    date=test[1].strip()
    D[firstName]=date
print D

输出:

{'danny d': '1994/7/7', 'bobby b': '1999/3/3'}

您需要在字典中存储姓名/日期,以便您可以通过选择姓名直接获取日期。

print D['danny d'] #Output: '1994/7/7'

如果您想在列表中存储日期,并通过索引访问此列表来获取它们。您可以将日期/名字定义为列表。每次浏览文件时都存储变量

import re
D={}
firstName,date=[],[]
for line in d.splitlines():
    test= re.split(';|,',line)
    firstName+=[test[0].strip()]
    date+=[test[1].strip()]

print date[1] #1994/7/7

您的列表日期应包含此内容['1999/3/3', '1994/7/7']

答案 3 :(得分:-1)

这就是你想要的:你需要使用Escape sequence

>>> l='danny d , 1994/7/7'
>>> re.split('[;,\.//]',l)
['danny d ', ' 1994', '7', '7']


>>> l='danny d , 1994/7/7'
>>> name,date = re.split('[;,\.]',l)
>>> name
'danny d '
>>> date
' 1994/7/7'

您可以使用strip从开始和结束中删除不需要的空间