从某个字符开始将 python 字符串拆分为 space
Split python string by space starting at certain character
我正在尝试 运行 对充满汽车数据的 .txt 文件进行一些基本分析。我已将文件读入 Python 并尝试将其拆分为适当的列,但是 "first column," 汽车名称有时会有多个单词。例如,下面两行包含我的文件中的一些信息:
- 汽车日期颜色数量(header行)
- 雪佛兰 Nova 7/1/2000 蓝色 28,000
- 凯迪拉克 7/1/2001 银色 30,000
因此,当我单独将每一行拆分为 spaces 时,我最终会得到不同大小的列表——在上面的示例中,"Chevy" 和 "Nova" 将是彼此分开。
我找到了一种方法来识别每行中代表汽车名称的部分:
for line in cardata:
if line == line[0]: #for header line
continue
else:
line = line.rstrip()
carnamebreakpoint = line.find('7/')
print carnamebreakpoint
carname = line[:carnamebreakpoint]
print carname
我现在想做的是告诉 python 在 space 之后拆分(最终目标是列表看起来像 [carname, date, color, number sold]),但我已经尝试使用 .split() 函数来做到这一点,但到目前为止没有运气。我很想获得有关如何进行的一些指导,因为我对编程还很陌生。
在此先感谢您的帮助!
首先在断点处对字符串进行切片,然后对结果调用split()
:
date, color, quantity = line[breakpoint:].split()
s = "Chevy Nova 7/1/2000 Blue 28,000"
s.rsplit(None,3)
只会从字符串末尾开始拆分3次:
In [4]: s = "Chevy Nova 7/1/2000 Blue 28,000"
In [5]: s.rsplit(None,3)
Out[5]: ['Chevy Nova', '7/1/2000', 'Blue', '28,000']
In [8]: s ="Car Date Color Quantity "
In [9]: s.rsplit(None,3)
Out[9]: ['Car', 'Date', 'Color', 'Quantity']
这假定最后三个项目将始终像您的示例中那样是单个单词字符串,这应该是正确的,否则您的索引方法也会失败。
还要忽略 header 您可以在文件 object.
上调用 next()
with open("your_file.txt") as f:
header = next(f)
for line in f:
car_name,date,col,mile = line.rstrip().rsplit(None,3)
print(car_name,date,col,mile)
('Chevy Nova', '7/1/2000', 'Blue', '28,000')
('Cadillac', '7/1/2001', 'Silver', '30,000')
根据您对数据格式的信心,您的解决方案可能不是最好的。
如果你得到的汽车日期不是某个月的 7 号,会发生什么情况?那么颜色 "Light Blue".
这种任务非常适合正则表达式的用例。
例如,给定这种正则表达式可以让您轻松地隔离 4 个组件:
^(.*) (\d{1,2}/\d{1,2}/\d{4}) (.*) ([\d,]+)$
在python中你可以这样使用它:
import re
s = "Chevy Nova 7/1/2000 Blue 28,000"
m = re.match(r"^(.*) (\d{1,2}/\d{1,2}/\d{4}) (.*) ([\d,]+)$", s)
m.group(1) # => Chevy Nova
m.group(2) # => 7/1/2000
m.group(3) # => Blue
m.group(4) # => 28,0000
如果你有一个包含多行的字符串,你可以像这样批处理它们:
s = """Chevy Nova 7/1/2000 Blue 28,000
Chevy Nova 10/6/2002 Light Blue 28,000
Cadillac 7/1/2001 Silver 30,000"""
re.findall(r"^(.*) (\d{1,2}/\d{1,2}/\d{4}) (.*) ([\d,]+)$", s, flags=re.MULTILINE)
# => [('Chevy Nova', '7/1/2000', 'Blue', '28,000'),
# => ('Chevy Nova', '10/6/2002', 'Light Blue', '28,000'),
# => ('Cadillac', '7/1/2001', 'Silver', '30,000')]
我正在尝试 运行 对充满汽车数据的 .txt 文件进行一些基本分析。我已将文件读入 Python 并尝试将其拆分为适当的列,但是 "first column," 汽车名称有时会有多个单词。例如,下面两行包含我的文件中的一些信息:
- 汽车日期颜色数量(header行)
- 雪佛兰 Nova 7/1/2000 蓝色 28,000
- 凯迪拉克 7/1/2001 银色 30,000
因此,当我单独将每一行拆分为 spaces 时,我最终会得到不同大小的列表——在上面的示例中,"Chevy" 和 "Nova" 将是彼此分开。
我找到了一种方法来识别每行中代表汽车名称的部分:
for line in cardata:
if line == line[0]: #for header line
continue
else:
line = line.rstrip()
carnamebreakpoint = line.find('7/')
print carnamebreakpoint
carname = line[:carnamebreakpoint]
print carname
我现在想做的是告诉 python 在 space 之后拆分(最终目标是列表看起来像 [carname, date, color, number sold]),但我已经尝试使用 .split() 函数来做到这一点,但到目前为止没有运气。我很想获得有关如何进行的一些指导,因为我对编程还很陌生。
在此先感谢您的帮助!
首先在断点处对字符串进行切片,然后对结果调用split()
:
date, color, quantity = line[breakpoint:].split()
s = "Chevy Nova 7/1/2000 Blue 28,000"
s.rsplit(None,3)
只会从字符串末尾开始拆分3次:
In [4]: s = "Chevy Nova 7/1/2000 Blue 28,000"
In [5]: s.rsplit(None,3)
Out[5]: ['Chevy Nova', '7/1/2000', 'Blue', '28,000']
In [8]: s ="Car Date Color Quantity "
In [9]: s.rsplit(None,3)
Out[9]: ['Car', 'Date', 'Color', 'Quantity']
这假定最后三个项目将始终像您的示例中那样是单个单词字符串,这应该是正确的,否则您的索引方法也会失败。
还要忽略 header 您可以在文件 object.
上调用 next()with open("your_file.txt") as f:
header = next(f)
for line in f:
car_name,date,col,mile = line.rstrip().rsplit(None,3)
print(car_name,date,col,mile)
('Chevy Nova', '7/1/2000', 'Blue', '28,000')
('Cadillac', '7/1/2001', 'Silver', '30,000')
根据您对数据格式的信心,您的解决方案可能不是最好的。
如果你得到的汽车日期不是某个月的 7 号,会发生什么情况?那么颜色 "Light Blue".
这种任务非常适合正则表达式的用例。
例如,给定这种正则表达式可以让您轻松地隔离 4 个组件:
^(.*) (\d{1,2}/\d{1,2}/\d{4}) (.*) ([\d,]+)$
在python中你可以这样使用它:
import re
s = "Chevy Nova 7/1/2000 Blue 28,000"
m = re.match(r"^(.*) (\d{1,2}/\d{1,2}/\d{4}) (.*) ([\d,]+)$", s)
m.group(1) # => Chevy Nova
m.group(2) # => 7/1/2000
m.group(3) # => Blue
m.group(4) # => 28,0000
如果你有一个包含多行的字符串,你可以像这样批处理它们:
s = """Chevy Nova 7/1/2000 Blue 28,000
Chevy Nova 10/6/2002 Light Blue 28,000
Cadillac 7/1/2001 Silver 30,000"""
re.findall(r"^(.*) (\d{1,2}/\d{1,2}/\d{4}) (.*) ([\d,]+)$", s, flags=re.MULTILINE)
# => [('Chevy Nova', '7/1/2000', 'Blue', '28,000'),
# => ('Chevy Nova', '10/6/2002', 'Light Blue', '28,000'),
# => ('Cadillac', '7/1/2001', 'Silver', '30,000')]