我正在尝试对填充了汽车数据的.txt文件运行一些基本分析。我已经在文件中读到了Python并试图将其拆分为相应的列,但是“第一列”,汽车名称,有时会有多个单词。例如,下面是两行,其中包含我的文件中包含的一些信息:
因此,当我单独用空格分割每一行时,我最终会得到不同大小的列表 - 在上面的例子中,“雪佛兰”和“新星”将彼此分开。
我找到了一种方法来识别代表汽车名称的每一行的部分:
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在 carname之后用空格拆分(列表的最终目标看起来像[carname,date,color,sold sold]) ,但我试过玩.split()函数来做到这一点,到目前为止没有运气。我喜欢关于如何继续的一些指导,因为我对编程很新。
提前感谢您的帮助!
答案 0 :(得分:2)
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']
这假设最后三个项目将始终是单个字符串,如您的示例中应该是正确的,否则您的索引方法也将失败。
另外要忽略标题,可以在文件对象上调用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')
答案 1 :(得分:1)
首先在断点处对字符串进行切片,然后在结果上调用split()
:
date, color, quantity = line[breakpoint:].split()
答案 2 :(得分:0)
根据您对数据格式的信心,您的解决方案可能不是最佳解决方案。
如果你买的车的日期不同于某个月的7号,会怎么样?那么“浅蓝色”的颜色呢。
这种任务非常适合正则表达式的用例。
例如,给定这种正则表达式可以让您轻松隔离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')]