Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中拆分文件的内容_Python_Python 3.x - Fatal编程技术网

在python中拆分文件的内容

在python中拆分文件的内容,python,python-3.x,Python,Python 3.x,我收到了以逗号分隔的总统姓名,其中有一些细节如下: James Earl Carter, Jr., 1977-1981, Democrat Ronald Wilson Reagan, 1981-1989, Republican George Herbert Walker Bush, 1989-1993, Republican Name = ['Carter' , 'Reagan' , 'Bush'] StartYears = [1977,1981,1989] EndYears = [198

我收到了以逗号分隔的总统姓名,其中有一些细节如下:

James Earl Carter, Jr., 1977-1981, Democrat
Ronald Wilson Reagan, 1981-1989, Republican
George Herbert Walker Bush, 1989-1993, Republican
Name = ['Carter' , 'Reagan' , 'Bush']

StartYears = [1977,1981,1989]

EndYears = [1981,1989,1993]

Party = ['Democrat','Republican','Republican']
现在我想要三张这样的清单:

James Earl Carter, Jr., 1977-1981, Democrat
Ronald Wilson Reagan, 1981-1989, Republican
George Herbert Walker Bush, 1989-1993, Republican
Name = ['Carter' , 'Reagan' , 'Bush']

StartYears = [1977,1981,1989]

EndYears = [1981,1989,1993]

Party = ['Democrat','Republican','Republican']
但我面临一些问题:

James Earl Carter, Jr. contains comma already so splitting is not working properly.

怎么做?请提供帮助。

使用
zip
函数和基于正则表达式:

>>> s="""James Earl Carter, Jr., 1977-1981, Democrat
... Ronald Wilson Reagan, 1981-1989, Republican
... George Herbert Walker Bush, 1989-1993, Republican"""
>>> 
>>> list(zip(*[re.findall(r'\w+(?=[,-]|$)',i) for i in s.split('\n')]))
[('Carter', 'Reagan', 'Bush'), 
 ('1977', '1981', '1989'), 
 ('1981', '1989', '1993'), 
 ('Democrat', 'Republican', 'Republican')]
以下正则表达式:

r'\w+(?=[,-]|$)'
将查找位于
-
前面或字符串末尾的任何单词字符组合

如果您处理的是我建议使用的较长列表,则更适合此类问题,并且当列表的列数不相同时也很好。它还接受一个
fillvalue
参数来填充缺少的列:

>>> s="""James Earl Carter, Jr., 1977-1981, Democrat,anothername,12222 
... Ronald Wilson Reagan, 1981-1989, Republican,33453
... George Herbert Walker Bush, 1989-1993, Republican"""

>>> from itertools import zip_longest
>>> list(zip_longest(*[re.findall(r'\w+(?=[,-]|$)',i) for i in s.split('\n')],fillvalue='**'))
[('Carter', 'Reagan', 'Bush'), 
 ('1977', '1981', '1989'), 
 ('1981', '1989', '1993'), 
 ('Democrat', 'Republican', 'Republican'), 
 ('anothername', '33453', '**')]
>>> 

请注意,在这两种情况下,如果您想迭代
izip_longest
zip
的结果,则不需要调用
list
。这只是为了演示结果

使用
zip
函数和基于正则表达式:

>>> s="""James Earl Carter, Jr., 1977-1981, Democrat
... Ronald Wilson Reagan, 1981-1989, Republican
... George Herbert Walker Bush, 1989-1993, Republican"""
>>> 
>>> list(zip(*[re.findall(r'\w+(?=[,-]|$)',i) for i in s.split('\n')]))
[('Carter', 'Reagan', 'Bush'), 
 ('1977', '1981', '1989'), 
 ('1981', '1989', '1993'), 
 ('Democrat', 'Republican', 'Republican')]
以下正则表达式:

r'\w+(?=[,-]|$)'
将查找位于
-
前面或字符串末尾的任何单词字符组合

如果您处理的是我建议使用的较长列表,则更适合此类问题,并且当列表的列数不相同时也很好。它还接受一个
fillvalue
参数来填充缺少的列:

>>> s="""James Earl Carter, Jr., 1977-1981, Democrat,anothername,12222 
... Ronald Wilson Reagan, 1981-1989, Republican,33453
... George Herbert Walker Bush, 1989-1993, Republican"""

>>> from itertools import zip_longest
>>> list(zip_longest(*[re.findall(r'\w+(?=[,-]|$)',i) for i in s.split('\n')],fillvalue='**'))
[('Carter', 'Reagan', 'Bush'), 
 ('1977', '1981', '1989'), 
 ('1981', '1989', '1993'), 
 ('Democrat', 'Republican', 'Republican'), 
 ('anothername', '33453', '**')]
>>> 

请注意,在这两种情况下,如果您想迭代
izip_longest
zip
的结果,则不需要调用
list
。这只是为了演示结果

从您的数据集中看,似乎只有名称可以包含
,其他人不会,因此您可以使用从后面拆分的
rsplit
函数,并为其指定参数
,'
2
,这意味着使用逗号从后面拆分,并在两次拆分时停止

范例-

s = "James Earl Carter, Jr., 1977-1981, Democrat".rsplit(',',2)
print(s)
>> ['James Earl Carter, Jr.', ' 1977-1981', ' Democrat']
>>> n = 'James Earl Carter, Jr.'.split(',')[0].split(' ')[-1]
>>> print(n)
Carter
>>> m = 'Ronald Wilson Reagan'.split(',')[0].split(' ')[-1]
>>> print(m)
Reagan
此外,如果对于
名称
列表,条件是如果没有
或如果有逗号,则在列表中选择姓氏,然后选择第一个逗号。一个简单的解决方案是使用“,”再次拆分名称列表,这一次正常的
split(“,”)
函数应该这样做,然后使用第一个元素(如果没有逗号,则只有一个元素),然后使用
split(“”)再次按空格拆分,然后使用
[-1]`索引获取最后一个元素

范例-

s = "James Earl Carter, Jr., 1977-1981, Democrat".rsplit(',',2)
print(s)
>> ['James Earl Carter, Jr.', ' 1977-1981', ' Democrat']
>>> n = 'James Earl Carter, Jr.'.split(',')[0].split(' ')[-1]
>>> print(n)
Carter
>>> m = 'Ronald Wilson Reagan'.split(',')[0].split(' ')[-1]
>>> print(m)
Reagan

从您的数据集中看,似乎只有名称可以包含
,其他名称则不会,因此您可以使用从后面拆分的
rsplit
函数,并为其指定参数
,'
2
,这意味着使用逗号从后面拆分,并在两个拆分处停止

范例-

s = "James Earl Carter, Jr., 1977-1981, Democrat".rsplit(',',2)
print(s)
>> ['James Earl Carter, Jr.', ' 1977-1981', ' Democrat']
>>> n = 'James Earl Carter, Jr.'.split(',')[0].split(' ')[-1]
>>> print(n)
Carter
>>> m = 'Ronald Wilson Reagan'.split(',')[0].split(' ')[-1]
>>> print(m)
Reagan
此外,如果对于
名称
列表,条件是如果没有
或如果有逗号,则在列表中选择姓氏,然后选择第一个逗号。一个简单的解决方案是使用“,”再次拆分名称列表,这一次正常的
split(“,”)
函数应该这样做,然后使用第一个元素(如果没有逗号,则只有一个元素),然后使用
split(“”)再次按空格拆分,然后使用
[-1]`索引获取最后一个元素

范例-

s = "James Earl Carter, Jr., 1977-1981, Democrat".rsplit(',',2)
print(s)
>> ['James Earl Carter, Jr.', ' 1977-1981', ' Democrat']
>>> n = 'James Earl Carter, Jr.'.split(',')[0].split(' ')[-1]
>>> print(n)
Carter
>>> m = 'Ronald Wilson Reagan'.split(',')[0].split(' ')[-1]
>>> print(m)
Reagan

如果要使用
re

# Assume: s = 'James Earl Carter, Jr., 1977-1981, Democrat'
reg = re.compile('(\w+\s+)*(?P<name>\w+),\D*(?P<startyear>\d+)-(?P<endyear>\d+),\s*(?P<party>\w+)')
m = reg.search(s)
Name.append(m.group('name'))
StartYears.append(m.group('startyear'))
EndYears.append(m.group('endyear'))
Party.append(m.group('party'))
#假设:s='James Earl Carter,Jr.,1977-1981,民主党'
reg=重新编译('(\w+\s+*(?P\w+),\D*(?P\D+)-(?P\D+),\s*(?P\w+))
m=注册搜索
Name.append(m.group('Name'))
附加(m.group('startyear'))
EndYears.append(m.group('endyear'))
附加方(m.group(“一方”))

如果您想使用
re

# Assume: s = 'James Earl Carter, Jr., 1977-1981, Democrat'
reg = re.compile('(\w+\s+)*(?P<name>\w+),\D*(?P<startyear>\d+)-(?P<endyear>\d+),\s*(?P<party>\w+)')
m = reg.search(s)
Name.append(m.group('name'))
StartYears.append(m.group('startyear'))
EndYears.append(m.group('endyear'))
Party.append(m.group('party'))
#假设:s='James Earl Carter,Jr.,1977-1981,民主党'
reg=重新编译('(\w+\s+*(?P\w+),\D*(?P\D+)-(?P\D+),\s*(?P\w+))
m=注册搜索
Name.append(m.group('Name'))
附加(m.group('startyear'))
EndYears.append(m.group('endyear'))
附加方(m.group(“一方”))

为此,您可以使用正则表达式。考虑到您希望避免名称之间使用逗号,我用了多年的时间首先拆分字符串,然后将第一部分作为名称处理,然后将第二部分作为参与方处理

search_string = """James Earl Carter, Jr., 1977-1981, Democrat
Ronald Wilson Reagan, 1981-1989, Republican
George Herbert Walker Bush, 1989-1993, Republican"""

import re
Name=[]
StartYears=[]
EndYears=[]
Party=[]
year = re.compile("[\d]{4}-[\d]{4}")
for i in search_string.split("\n"):
    split_string =  year.search(i).group(0)
    l = i.split(split_string)[0].split(",")[0].split()
    Name.append(l[-1])
    StartYears.append(split_string.split("-")[0])
    EndYears.append(split_string.split("-")[1])
    Party.append(i.split(split_string)[1].split(",")[1].strip())

print Name
print StartYears
print EndYears
print Party

为此,可以使用正则表达式。考虑到您希望避免名称之间使用逗号,我用了多年的时间首先拆分字符串,然后将第一部分作为名称处理,然后将第二部分作为参与方处理

search_string = """James Earl Carter, Jr., 1977-1981, Democrat
Ronald Wilson Reagan, 1981-1989, Republican
George Herbert Walker Bush, 1989-1993, Republican"""

import re
Name=[]
StartYears=[]
EndYears=[]
Party=[]
year = re.compile("[\d]{4}-[\d]{4}")
for i in search_string.split("\n"):
    split_string =  year.search(i).group(0)
    l = i.split(split_string)[0].split(",")[0].split()
    Name.append(l[-1])
    StartYears.append(split_string.split("-")[0])
    EndYears.append(split_string.split("-")[1])
    Party.append(i.split(split_string)[1].split(",")[1].strip())

print Name
print StartYears
print EndYears
print Party
输出

输出

对不起,请参阅编辑的帖子。我想要['Carter'、'Reagan'、'Bush']还有其他的列表呢?这根本没有给他们想要的输出。对不起,请看编辑后的帖子。我想要['Carter'、'Reagan'、'Bush']还有其他列表呢?这根本没有给他们想要的输出。这些列表从哪里来?你需要使用正则表达式来解析这些行。
不包含逗号,你可以使用
.split
小OT,但是变量中的“\u1”而不是camel case更像python。e、 g.使用“开始年”而不是“开始年”。这些列表来自何处?您需要使用正则表达式来解析
不包含逗号,您可以只使用
.split
小OT,但变量中的“\u”而不是驼峰大小写更像python。e、 g.使用“开始年”而不是“开始年”。我认为这可能是更好的开始:)。如何制作列表请帮助
['James Earl Carter,Jr.','1977-1981','Democratic']
是一个列表,在字符串上运行
rsplit
split
函数,返回列表。你可以开始学习列表,但这并没有给出OP想要的!这确实回答了OP的问题-
James-Earl-Carter,Jr.已经包含逗号,所以拆分无法正常工作。怎么做?请帮助。
OP想要
Carter
from name!和年分开,你可以请比较你的解决方案!!!我想选民们在这里没有看到任何答案