王大可2000 发表于 2023-7-12 09:18:03

读取文件

要求:
1.首先在,站点.xlsx 文件中,遍历福建省所有的‘站号’。
2.根据已得福建省的‘区站号’,在 MON 文件夹下遍历出所有福建省文件,
举例每个文件名中都包含区站号,为后五位数字。
3.将第二步所得福建省所有(.txt)文件转为 excel 文件,excel 文件后缀要求.xlsx
代码:
mport os
import pandas as pd

# 读取三省站点.xlsx文件
df_stations = pd.read_excel('站点.xlsx', usecols=['站号'])

# 获取福建省的所有区站号
fujian_stations = df_stations]

# 遍历MON文件夹下的所有福建省文件
mon_folder = 'MON'
fujian_files = []
for filename in os.listdir(mon_folder):
    if filename.endswith('.txt') and filename[-9:-4].isdigit() and int(filename[-9:-4]) in fujian_stations:
      fujian_files.append(os.path.join(mon_folder, filename))

# 将福建省所有txt文件转为excel文件
output_folder = 'output'
os.makedirs(output_folder, exist_ok=True)

for file_path in fujian_files:
    df = pd.read_csv(file_path, delimiter='\t')# 假设txt文件使用制表符分隔数据
    output_path = os.path.join(output_folder, os.path.basename(file_path).replace('.txt', '.xlsx'))
    df.to_excel(output_path, index=False)
错误:
line 3767, in __getitem__
    indexer = self.columns._get_indexer_strict(key, "columns")
line 5876, in _get_indexer_strict
    self._raise_if_missing(keyarr, indexer, axis_name)
line 5935, in _raise_if_missing
    raise KeyError(f"None of [{key}] are in the [{axis_name}]")
KeyError: "None of ,\n      dtype='float64', length=226)] are in the "
求错误原因及修改后的代码{:9_221:}

陶远航 发表于 2023-7-12 09:18:18

根据错误信息看,出现了 KeyError 错误,提示指定的列名在 DataFrame 的列中找不到。原因可能是读取的 df_stations DataFrame 中的 '站号' 列名不正确。

我注意到代码中的这一行可能存在问题:
fujian_stations = df_stations]


请检查一下 '站号' 是否是正确的列名。如果列名不正确,将其修改为正确的列名。此外,你还可以使用 .dropna() 方法过滤掉缺失值,代码如下所示:
fujian_stations = df_stations['站号'].dropna()


另外,在遍历文件名时,可以使用 str.isdigit() 或者正则表达式来判断是否为数字后五位。修改后的代码如下:

import os
import pandas as pd

# 读取三省站点.xlsx文件
df_stations = pd.read_excel('站点.xlsx', usecols=['站号'])

# 获取福建省的所有区站号
fujian_stations = df_stations['站号'].dropna()

# 遍历MON文件夹下的所有福建省文件
mon_folder = 'MON'
fujian_files = []
for filename in os.listdir(mon_folder):
    if filename.endswith('.txt') and filename[-9:-4].isdigit() and int(filename[-9:-4]) in fujian_stations:
      fujian_files.append(os.path.join(mon_folder, filename))

# 将福建省所有txt文件转为excel文件
output_folder = 'output'
os.makedirs(output_folder, exist_ok=True)
for file_path in fujian_files:
    df = pd.read_csv(file_path, delimiter='\t')# 假设txt文件使用制表符分隔数据
    output_path = os.path.join(output_folder, os.path.basename(file_path).replace('.txt', '.xlsx'))
    df.to_excel(output_path, index=False)


请根据你的实际情况修改代码中的相关路径和参数,以确保程序能够正确执行。

isdkz 发表于 2023-7-12 09:20:47

错误发生在代码这一行fujian_stations = df_stations] ,其中你正在尝试使用 df_stations['站号'] 作为索引来从 df_stations 中选择数据,这通常用于从布尔索引中选择数据。此处的df_stations['站号']本身就是一组数据而不是一个布尔索引,因此代码会报错。

看起来你想要从 df_stations 中选择出福建省的所有站号,但是你没有提供站点属于福建省的条件,因此无法进行选择。

如果你有一个条件列如 '省份',你可以这样做:

fujian_stations = df_stations == '福建']['站号']


但是根据你的描述,我假设 '站点.xlsx' 文件中已经只包含了福建省的站号,那么你只需要这样:

fujian_stations = df_stations['站号']


然后你需要将这些站号转换为整数,然后转换为集合,以便于在遍历文件时进行快速查找:

fujian_stations = set(df_stations['站号'].dropna().astype(int))


那么你的修改后的代码就是:

import os
import pandas as pd

# 读取三省站点.xlsx文件
df_stations = pd.read_excel('站点.xlsx', usecols=['站号'])

# 获取福建省的所有区站号
fujian_stations = set(df_stations['站号'].dropna().astype(int))

# 遍历MON文件夹下的所有福建省文件
mon_folder = 'MON'
fujian_files = []
for filename in os.listdir(mon_folder):
    if filename.endswith('.txt') and filename[-9:-4].isdigit() and int(filename[-9:-4]) in fujian_stations:
      fujian_files.append(os.path.join(mon_folder, filename))

# 将福建省所有txt文件转为excel文件
output_folder = 'output'
os.makedirs(output_folder, exist_ok=True)

for file_path in fujian_files:
    df = pd.read_csv(file_path, delimiter='\t')# 假设txt文件使用制表符分隔数据
    output_path = os.path.join(output_folder, os.path.basename(file_path).replace('.txt', '.xlsx'))
    df.to_excel(output_path, index=False)

王大可2000 发表于 2023-7-13 17:23:39

isdkz 发表于 2023-7-12 09:20
错误发生在代码这一行fujian_stations = df_stations] ,其中你正在尝试使用 df_sta ...

如果TXT文件中有四列数据,该如何在转化Excel文件时候将各列数据分别放在ABCD列并插入表头一、二、三、四?

isdkz 发表于 2023-7-13 17:25:27

王大可2000 发表于 2023-7-13 17:23
如果TXT文件中有四列数据,该如何在转化Excel文件时候将各列数据分别放在ABCD列并插入表头一、二、三、四 ...

在读取TXT文件时,你可以使用Pandas的 read_csv 函数,并指定列名。对于你的情况,你可以将读取和转换部分的代码修改如下:

# 读取txt文件并指定列名
df = pd.read_csv(file_path, delimiter='\t', names=['一', '二', '三', '四'])

# 保存为excel文件
output_path = os.path.join(output_folder, os.path.basename(file_path).replace('.txt', '.xlsx'))
df.to_excel(output_path, index=False)


这样,在读取txt文件时,Pandas将使用你提供的列名列表('一', '二', '三', '四')作为DataFrame的列名。然后,当你将DataFrame保存为Excel文件时,这些列名将自动作为Excel文件的列名。

王大可2000 发表于 2023-7-20 10:52:23

isdkz 发表于 2023-7-12 09:20
错误发生在代码这一行fujian_stations = df_stations] ,其中你正在尝试使用 df_sta ...

如果已知MON 文件夹中所有TXT文件有四列数据,每一列数据由空格隔开如
1959    1    0      19.40
并在转化成Excel的时候插入表头,‘Year’ ‘Mon’ ‘Day’ ‘PRE’
该如何修改
页: [1]
查看完整版本: 读取文件