被分隔空间打开并阅读文本文件

问题描述 投票:1回答:6

我有一个像下面的空格分隔文本文件:

2004          Temperature for KATHMANDU AIRPORT       
        Tmax  Tmin
     1  18.8   2.4 
     2  19.0   1.1 
     3  18.3   1.7 
     4  18.3   1.0 
     5  17.8   1.3 

我想单独计算两者Tmax和三甲基铟的平均值。但是,我有很难阅读文本文件。我试图qazxsw POI。

this link like

但是,它给我的错误:import re list_b = [] list_d = [] with open('TA103019.95.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 这里有什么问题?

python csv
6个回答
2
投票

解决一个简单的方法是使用IndexError: list index out of range功能。当然,你需要删除的前两行:

split()

你得到:

with io.open("path/to/file.txt", mode="r", encoding="utf-8") as f:
    next(f)
    next(f)
    for line in f:
        print(line.split())

引用文档:

如果没有指定SEP是或者是['1', '18.8', '2.4'] ['2', '19.0', '1.1'] ['3', '18.3', '1.7'] ['4', '18.3', '1.0'] ['5', '17.8', '1.3'] ,不同的分割算法应用于:连续空白的运行被视为一个分隔符,结果将不包含空字符串的开始或结束如果字符串开头或结尾的空白。


1
投票
None

我已经加入我的答案与代码本身的一些评论。

因为在有你的list_line只有一个元素(即2004年在文件的第一行),您试图访问的第1和第list_line的第三索引你都拿到import re list_b = [] list_d = [] with open('TA103019.95.txt', 'r') as f: for line in f: # regex is corrected to match the decimal values only list_line = re.findall(r"\d+\.\d+", line) # error condition handled where the values are not found if len(list_line) < 2: continue # indexes are corrected below list_b.append(float(list_line[0])) #appends second column list_d.append(float(list_line[1])) #appends fourth column print list_b print list_d


1
投票

完整的解决方案

Index out of range error

感谢Dan D.更多的优雅的解决方案


1
投票

如前所述def readit(file_name,start_line = 2): # start_line - where your data starts (2 line mean 3rd line, because we start from 0th line) with open(file_name,'r') as f: data = f.read().split('\n') data = [i.split(' ') for i in data[start_line:]] for i in range(len(data)): row = [(sub) for sub in data[i] if len(sub)!=0] yield int(row[0]),float(row[1]),float(row[2]) iterator = readit('TA103019.95.txt') index, tmax, tmin = zip(*iterator) mean_Tmax = sum(tmax)/len(tmax) mean_Tmin = sum(tmin)/len(tmin) print('Mean Tmax: ',mean_Tmax) print('Mean Tmnin: ',mean_Tmin) >>> ('Mean Tmax: ', 18.439999999999998) >>> ('Mean Tmnin: ', 1.5) here列出了正则表达式的所有比赛。您定义的表达式不会在文件中匹配任何东西,所以你会得到一个空数组,导致错误,当您尝试访问re.findall

  • 要在该文件匹配基地的表达会list_line[1],小数点前至少一个数字,即小数点后至少有一个数字匹配任何十进制数
  • 即使这样表达不会在头两行匹配任何,所以你要检查空数组
  • 结果不知道任何列,只是模式的匹配,并且会有每条数据线的两场比赛 - 你会想indizes r"\d+\.\d+"0

所以:进口重新list_b = [] list_d = []

1

0
投票

简化你的生活,避免“重”了这个问题。

也许你正在阅读的标题行误?如果该文件的格式是固定的,我通常会“烧钱”的标题行开始循环像以前读过的一行:

with open('TA103019.95.txt', 'r') as f:
    for line in f:
        list_line = re.findall(r'\d+\.\d+', line)
        if len(list_line) == 2 :
            list_b.append(float(list_line[0])) #appends second column
            list_d.append(float(list_line[1])) #appends fourth column

print list_b
print list_d

然后,你必须标记列表,这将是你需要转换为整数或浮点数或什么,并从那里串!

把一对夫妇print语句来就领了什么?


0
投票

有没有可能是您的文件制表符分隔?

对于制表符分隔:

with open(file_name, 'r') as f:
    f.readline()  # burn the header row
    for line in f:
        tokens = line.strip().split(' ')   # tokenize the row based on spaces
© www.soinside.com 2019 - 2024. All rights reserved.