Python 打开并读取以空格分隔的txt文件

Python 打开并读取以空格分隔的txt文件,python,csv,Python,Csv,我有一个空格分隔的txt文件,如下所示: 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和Tmin的平均值。但是,我很难读取txt文件。我试过了 但是,这给了我一个错误: 索引

我有一个空格分隔的txt文件,如下所示:

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和Tmin的平均值。但是,我很难读取txt文件。我试过了

但是,这给了我一个错误:
索引器错误:列表索引超出范围

这里出了什么问题?

简化你的生活,避免这个问题的“re”

也许您误读了标题行?如果文件的格式是固定的,我通常在开始循环之前用一行字“烧录”标题行,如:

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
然后你有一个令牌列表,它是字符串,你需要将其转换为int或float或其他任何形式,然后从那里开始


输入几条打印的语句,看看你正在学习什么…

简化你的生活,避免这个问题的“re”

也许您误读了标题行?如果文件的格式是固定的,我通常在开始循环之前用一行字“烧录”标题行,如:

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
然后你有一个令牌列表,它是字符串,你需要将其转换为int或float或其他任何形式,然后从那里开始


输入几条打印语句以查看您正在获取的内容…

一个简单的解决方法是使用函数。 当然,您需要删除前两行:

将io.open(“path/to/file.txt”,mode=“r”,encoding=“utf-8”)作为f: 下一个(f) 下一个(f) 对于f中的行: 打印(line.split()) 你会得到:

['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']
引用文件:

如果未指定sep或sep为
None
,则会应用不同的拆分算法:连续空格的运行被视为单个分隔符,如果字符串具有前导或尾随空格,则结果的开头或结尾将不包含空字符串


解决这个问题的一个简单方法是使用函数。 当然,您需要删除前两行:

将io.open(“path/to/file.txt”,mode=“r”,encoding=“utf-8”)作为f: 下一个(f) 下一个(f) 对于f中的行: 打印(line.split()) 你会得到:

['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']
引用文件:

如果未指定sep或sep为
None
,则会应用不同的拆分算法:连续空格的运行被视为单个分隔符,如果字符串具有前导或尾随空格,则结果的开头或结尾将不包含空字符串


您的文件可能是以制表符分隔的吗

对于制表符分隔的:

with open('TA103019.95.txt', 'r') as f:
    for idx, line in enumerate(f):
        if idx > 1:                    
            cols = line.split('\t'): #for space delimited change '\t' to ' '
            tmax = float(col[1])
            tmin = float(col[2])
            #calc mean

            mean = (tmax + tmin) / 2
            #not sure what you want to do with the result

您的文件可能是以制表符分隔的吗

对于制表符分隔的:

with open('TA103019.95.txt', 'r') as f:
    for idx, line in enumerate(f):
        if idx > 1:                    
            cols = line.split('\t'): #for space delimited change '\t' to ' '
            tmax = float(col[1])
            tmin = float(col[2])
            #calc mean

            mean = (tmax + tmin) / 2
            #not sure what you want to do with the result
如上所述,
re.findall
列出正则表达式的所有匹配项。您定义的表达式与文件中的任何内容都不匹配,因此您会得到一个空数组,这导致您在尝试访问
列表行[1]
时出错

  • 要基于该文件匹配的表达式将是
    r“\d+\.\d+”
    ,将任何十进制数与小数点前至少一位、小数点后至少一位匹配
  • 即使这个表达式也不会匹配前两行中的任何内容,因此您需要检查空数组
  • 结果不知道任何列,只知道模式的匹配,每个数据行将有两个匹配项-您将需要将
    0
    1
因此: 进口稀土 列表_b=[] 列表d=[]

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
如上所述,
re.findall
列出正则表达式的所有匹配项。您定义的表达式与文件中的任何内容都不匹配,因此您会得到一个空数组,这导致您在尝试访问
列表行[1]
时出错

  • 要基于该文件匹配的表达式将是
    r“\d+\.\d+”
    ,将任何十进制数与小数点前至少一位、小数点后至少一位匹配
  • 即使这个表达式也不会匹配前两行中的任何内容,因此您需要检查空数组
  • 结果不知道任何列,只知道模式的匹配,每个数据行将有两个匹配项-您将需要将
    0
    1
因此: 进口稀土 列表_b=[] 列表d=[]

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
重新导入
列表_b=[]
列表d=[]
以open('TA103019.95.txt','r')作为f:
对于f中的行:
#正则表达式被更正为仅与十进制值匹配
list\u line=re.findall(r“\d+\.\d+”,第行)
#未找到值时处理的错误条件
如果len(列表线)<2:
持续
#索引更正如下
list_b.append(float(list_行[0]))追加第二列
list\u d.append(float(list\u line[1]))\n附加第四列
打印列表
打印列表
我在代码中添加了我的答案和一些注释

您得到的
索引超出范围错误
,是因为您的列表行只有一个元素(即文件第一行中的2004),并且您试图访问列表行的第一个和第三个索引。

import re
列表_b=[]
列表d=[]
以open('TA103019.95.txt','r')作为f:
对于f中的行:
#正则表达式被更正为仅与十进制值匹配
list\u line=re.findall(r“\d+\.\d+”,第行)
#未找到值时处理的错误条件
如果len(列表线)<2:
持续
#索引更正如下
list_b.append(float(list_行[0]))追加第二列
list_d.append(float(list_行[1]))追加第四列
打印列表
打印列表
我在代码中添加了我的答案和一些注释


您得到的索引超出范围错误是因为您的列表行只有一个元素(即文件第一行中的2004),并且您试图访问列表行的第一个和第三个索引。

完整解决方案

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)
多亏了<