鱼C论坛

 找回密码
 立即注册
查看: 1201|回复: 5

[已解决]读取文件

[复制链接]
发表于 2023-7-12 09:18:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
要求:
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[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")[1]
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 [Index([    nan, 58446.0, 58448.0, 58449.0, 58450.0, 58451.0, 58452.0, 58453.0,\n       58454.0, 58455.0,\n       ...\n       59654.0, 59655.0, 59656.0, 59658.0, 59659.0, 59663.0, 59664.0, 59673.0,\n       59750.0, 59754.0],\n      dtype='float64', length=226)] are in the [columns]"

求错误原因及修改后的代码
最佳答案
2023-7-12 09:18:18
根据错误信息看,出现了 KeyError 错误,提示指定的列名在 DataFrame 的列中找不到。原因可能是读取的 df_stations DataFrame 中的 '站号' 列名不正确。

我注意到代码中的这一行可能存在问题:
  1. fujian_stations = df_stations[df_stations['站号']]
复制代码

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

另外,在遍历文件名时,可以使用 str.isdigit() 或者正则表达式来判断是否为数字后五位。修改后的代码如下:
  1. import os
  2. import pandas as pd
  3. # 读取三省站点.xlsx文件
  4. df_stations = pd.read_excel('站点.xlsx', usecols=['站号'])
  5. # 获取福建省的所有区站号
  6. fujian_stations = df_stations['站号'].dropna()
  7. # 遍历MON文件夹下的所有福建省文件
  8. mon_folder = 'MON'
  9. fujian_files = []
  10. for filename in os.listdir(mon_folder):
  11.     if filename.endswith('.txt') and filename[-9:-4].isdigit() and int(filename[-9:-4]) in fujian_stations:
  12.         fujian_files.append(os.path.join(mon_folder, filename))
  13. # 将福建省所有txt文件转为excel文件
  14. output_folder = 'output'
  15. os.makedirs(output_folder, exist_ok=True)
  16. for file_path in fujian_files:
  17.     df = pd.read_csv(file_path, delimiter='\t')  # 假设txt文件使用制表符分隔数据
  18.     output_path = os.path.join(output_folder, os.path.basename(file_path).replace('.txt', '.xlsx'))
  19.     df.to_excel(output_path, index=False)
复制代码

请根据你的实际情况修改代码中的相关路径和参数,以确保程序能够正确执行。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-12 09:18:18 | 显示全部楼层    本楼为最佳答案   
根据错误信息看,出现了 KeyError 错误,提示指定的列名在 DataFrame 的列中找不到。原因可能是读取的 df_stations DataFrame 中的 '站号' 列名不正确。

我注意到代码中的这一行可能存在问题:
  1. fujian_stations = df_stations[df_stations['站号']]
复制代码

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

另外,在遍历文件名时,可以使用 str.isdigit() 或者正则表达式来判断是否为数字后五位。修改后的代码如下:
  1. import os
  2. import pandas as pd
  3. # 读取三省站点.xlsx文件
  4. df_stations = pd.read_excel('站点.xlsx', usecols=['站号'])
  5. # 获取福建省的所有区站号
  6. fujian_stations = df_stations['站号'].dropna()
  7. # 遍历MON文件夹下的所有福建省文件
  8. mon_folder = 'MON'
  9. fujian_files = []
  10. for filename in os.listdir(mon_folder):
  11.     if filename.endswith('.txt') and filename[-9:-4].isdigit() and int(filename[-9:-4]) in fujian_stations:
  12.         fujian_files.append(os.path.join(mon_folder, filename))
  13. # 将福建省所有txt文件转为excel文件
  14. output_folder = 'output'
  15. os.makedirs(output_folder, exist_ok=True)
  16. for file_path in fujian_files:
  17.     df = pd.read_csv(file_path, delimiter='\t')  # 假设txt文件使用制表符分隔数据
  18.     output_path = os.path.join(output_folder, os.path.basename(file_path).replace('.txt', '.xlsx'))
  19.     df.to_excel(output_path, index=False)
复制代码

请根据你的实际情况修改代码中的相关路径和参数,以确保程序能够正确执行。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-12 09:20:47 | 显示全部楼层
错误发生在代码这一行  fujian_stations = df_stations[df_stations['站号']] ,其中你正在尝试使用 df_stations['站号'] 作为索引来从 df_stations 中选择数据,这通常用于从布尔索引中选择数据。此处的  df_stations['站号']  本身就是一组数据而不是一个布尔索引,因此代码会报错。

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

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

  1. fujian_stations = df_stations[df_stations['省份'] == '福建']['站号']
复制代码


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

  1. fujian_stations = df_stations['站号']
复制代码


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

  1. fujian_stations = set(df_stations['站号'].dropna().astype(int))
复制代码


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

  1. import os
  2. import pandas as pd

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

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

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

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

  16. for file_path in fujian_files:
  17.     df = pd.read_csv(file_path, delimiter='\t')  # 假设txt文件使用制表符分隔数据
  18.     output_path = os.path.join(output_folder, os.path.basename(file_path).replace('.txt', '.xlsx'))
  19.     df.to_excel(output_path, index=False)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-13 17:23:39 | 显示全部楼层
isdkz 发表于 2023-7-12 09:20
错误发生在代码这一行  fujian_stations = df_stations[df_stations['站号']] ,其中你正在尝试使用 df_sta ...

如果TXT文件中有四列数据,该如何在转化Excel文件时候将各列数据分别放在ABCD列并插入表头一、二、三、四?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

  3. # 保存为excel文件
  4. output_path = os.path.join(output_folder, os.path.basename(file_path).replace('.txt', '.xlsx'))
  5. df.to_excel(output_path, index=False)
复制代码


这样,在读取txt文件时,Pandas将使用你提供的列名列表('一', '二', '三', '四')作为DataFrame的列名。然后,当你将DataFrame保存为Excel文件时,这些列名将自动作为Excel文件的列名。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-20 10:52:23 | 显示全部楼层
isdkz 发表于 2023-7-12 09:20
错误发生在代码这一行  fujian_stations = df_stations[df_stations['站号']] ,其中你正在尝试使用 df_sta ...

如果已知MON 文件夹中所有TXT文件有四列数据,每一列数据由空格隔开如
1959    1    0      19.40
并在转化成Excel的时候插入表头,‘Year’ ‘Mon’ ‘Day’ ‘PRE’
该如何修改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 05:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表