如何在Python 2.7中打开以空格或其他分隔符的文本文件?

2 投票
4 回答
12345 浏览
提问于 2025-04-20 19:34

我有一个我认为是用空格分隔的文本文件,我想打开它并把一些数据复制到列表里(使用Python 2.7)。下面是数据文件的一部分:

    0.000000       11.00      737.09        1.00     1116.00
    0.001000       14.00      669.29       10.00      613.70
    0.002000       15.00      962.27        2.00      623.50
    0.003000        7.00      880.86        7.00      800.71
    0.004000        9.00      634.67        3.00     1045.00
    0.005000       12.00      614.67        3.00      913.33
    0.006000       12.00      782.58        6.00      841.00
    0.007000       13.00      860.08        6.00      354.00
    0.008000       14.00      541.07        4.00      665.25
    0.009000       14.00      763.00        6.00     1063.00
    0.010000        9.00      790.33        6.00      857.83
    0.011000        6.00      899.83        4.00     1070.75
    0.012000       16.00      710.88       10.00      809.90
    0.013000       12.00      863.50        7.00      923.14
    0.014000        9.00      591.67        6.00      633.17
    0.015000       12.00      740.58        6.00      837.00
    0.016000       10.00      727.60        7.00      758.00
    0.017000       12.00      838.75        4.00      638.75
    0.018000        9.00      991.33        7.00      731.57
    0.019000       12.00      680.75        5.00     1079.40
    0.020000       15.00      843.20        3.00      546.00
    0.021000       11.00      795.18        5.00     1317.20
    0.022000        9.00      943.33        5.00      911.00
    0.023000       13.00      711.23        3.00      981.67
    0.024000       11.00      922.73        5.00     1111.00
    0.025000     1112.00      683.58        6.00      542.83
    0.026000       15.00     1053.80        5.00     1144.40

以下是我尝试过的代码,但它没有成功。我想要两个列表,分别来自第二列和第四列。

listb = []
listd = []
with open('data_file.txt', 'r') as file:        
     reader = csv.reader(file,delimiter=' ')
     for a,b,c,d,e in reader:   
         listb.append(int(b))
         listd.append(int(d))  

我哪里做错了呢?

4 个回答

0
f=open("input.txt",'r')
x=f.readlines()
list1=[]
list2=[]
import re
for line in x:
  pattern=re.compile(r"(\d+)(?=\.)")
  li=pattern.findall(line)
  list1.append(li[1])
  list2.append(li[3])

如果你只想抓取整数,而不想要小数,可以使用这个方法。

0

你可以使用正则表达式找到你需要的所有值。

import re

list_b = []
list_d = []

with open('C://data_file.txt', 'r') as f:
    for line in f:
        list_line = re.findall(r"[\d.\d+']+", line)
        list_b.append(float(list_line[1])) #appends second column
        list_d.append(float(list_line[3])) #appends fourth column

print list_b
print list_d
2

一个替代的方法是利用内置的 str.split() 函数:

a, b, c, d, e = zip(*((map(float, line.split()) for line in open('data_file.txt'))))
0

问题在于字段(列)之间有多个空格。

CSV是“逗号分隔值”的意思。想象一下,如果你用逗号代替空格,你文件的第一行看起来会是这样的:

,,,,0.000000,,,,,,,11.00,,,,,,737.09,,,,,,,1.00,,,,,1116.00

这样,CSV读取器就会在这一行中看到超过5个字段(列)。

你有两个选择:

  1. 改用单个空格作为分隔符
  2. 使用简单的split()来处理多个空白字符:

 listb = []
 listd = []
 with open('text', 'r') as file:
    for row in file:
        a, b, c, d, e = row.split()
        listb.append(int(b))
        listd.append(int(d))

附注:一旦这部分工作正常,你会遇到一个问题,就是在像“11.00”这样的字符串上调用int(),因为它们并不是真正的整数。所以我建议使用类似这样的方式:

int(float(b))

撰写回答