王大可2000 发表于 2023-7-20 15:10:50

提取文件转Excel

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=' ')
    output_path = os.path.join(output_folder, os.path.basename(file_path).replace('.txt', '.xlsx'))
    df.to_excel(output_path, index=False)
如果已知MON 文件夹中所有TXT文件有四列数据,每一列数据由空格隔开如
1959    1    0      19.40
并在转化成Excel的时候插入表头,‘Year’ ‘Mon’ ‘Day’ ‘PRE’
该如何修改

Mike_python小 发表于 2023-7-20 15:11:10

问题分析:

根据提供的代码,您希望将MON文件夹下的TXT文件转换为Excel文件,并在Excel文件中插入表头。每个TXT文件有四列数据,每列数据由空格隔开。你需要修改代码来实现这个目标。

修正后的代码如下:


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=' ', header=None)
    df.columns = ['Year', 'Mon', 'Day', 'PRE']# 添加表头
    output_path = os.path.join(output_folder, os.path.basename(file_path).replace('.txt', '.xlsx'))
    df.to_excel(output_path, index=False)


修正后的代码在读取TXT文件并转换为DataFrame时指定了header=None,即不使用原有的首行作为表头。然后使用df.columns给DataFrame添加了新的表头。

现在,当代码转换TXT文件为Excel文件时,会在每个Excel文件中插入表头'Year'、'Mon'、'Day'和'PRE'。您可以在本地运行修正后的代码来验证结果。

希望这次的回答对您有帮助!如果您还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

陶远航 发表于 2023-7-20 15:11:11

你好!根据你的要求,以下是修改后的代码:

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=' ', names=['Year', 'Mon', 'Day', 'PRE'])
    output_path = os.path.join(output_folder, os.path.basename(file_path).replace('.txt', '.xlsx'))
    df.to_excel(output_path, index=False)

print("转换完成!")


主要的修改包括:
- 根据你的要求,添加了names=['Year', 'Mon', 'Day', 'PRE']参数来指定列的表头。
- 修改了输出文件的格式,将.txt替换为.xlsx。

这段代码会遍历MON文件夹下的所有符合条件的文本文件,并将其转换为Excel文件,同时插入了指定的表头。

希望能帮到你!如果还有其他问题,请随时提问。

isdkz 发表于 2023-7-20 15:11:39

您可以在调用pd.read_csv方法时传入names参数,这将设置 DataFrame 的列名。代码修改如下:

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=' ', names=['Year', 'Mon', 'Day', 'PRE'])
    output_path = os.path.join(output_folder, os.path.basename(file_path).replace('.txt', '.xlsx'))
    df.to_excel(output_path, index=False)


在这段代码中, names=['Year', 'Mon', 'Day', 'PRE']设置了列的名字为 'Year', 'Mon', 'Day', 'PRE'。所以在读取txt文件时,即使源文件中没有列名,也会按照您设定的列名来生成DataFrame。之后,当您把DataFrame存为Excel文件时,列名也会一并被存入。

王大可2000 发表于 2023-7-20 15:30:25

isdkz 发表于 2023-7-20 15:11
您可以在调用pd.read_csv方法时传入names参数,这将设置 DataFrame 的列名。代码修改如下:



为什么会出现以下错误
chunks = self._reader.read_low_memory(nrows)
File "pandas\_libs\parsers.pyx", line 812, in pandas._libs.parsers.TextReader.read_low_memory
File "pandas\_libs\parsers.pyx", line 873, in pandas._libs.parsers.TextReader._read_rows
File "pandas\_libs\parsers.pyx", line 848, in pandas._libs.parsers.TextReader._tokenize_rows
File "pandas\_libs\parsers.pyx", line 859, in pandas._libs.parsers.TextReader._check_tokenize_status
File "pandas\_libs\parsers.pyx", line 2025, in pandas._libs.parsers.raise_parser_error
pandas.errors.ParserError: Error tokenizing data. C error: Expected 15 fields in line 13, saw 16

王大可2000 发表于 2023-7-20 15:36:27

Mike_python小 发表于 2023-7-20 15:11
问题分析:

根据提供的代码,您希望将MON文件夹下的TXT文件转换为Excel文件,并在Excel文件中插入表头。每 ...

为什么会出现以下错误
chunks = self._reader.read_low_memory(nrows)
File "pandas\_libs\parsers.pyx", line 812, in pandas._libs.parsers.TextReader.read_low_memory
File "pandas\_libs\parsers.pyx", line 873, in pandas._libs.parsers.TextReader._read_rows
File "pandas\_libs\parsers.pyx", line 848, in pandas._libs.parsers.TextReader._tokenize_rows
File "pandas\_libs\parsers.pyx", line 859, in pandas._libs.parsers.TextReader._check_tokenize_status
File "pandas\_libs\parsers.pyx", line 2025, in pandas._libs.parsers.raise_parser_error
pandas.errors.ParserError: Error tokenizing data. C error: Expected 15 fields in line 13, saw 16

isdkz 发表于 2023-7-20 15:37:13

王大可2000 发表于 2023-7-20 15:30
为什么会出现以下错误
chunks = self._reader.read_low_memory(nrows)
File "pandas\_libs\parsers ...

这个错误是由于 pandas 在解析文件时发现了数据的不一致性。具体来说,它期望在第13行看到15个字段,但实际上看到了16个字段。这可能是由于数据文件中存在额外的分隔符、缺失值或者其他的格式错误。

一种可能的解决方案是增加参数error_bad_lines=False到pd.read_csv函数中,这样在读取数据时,如果遇到格式错误的行,pandas 就会跳过这一行而不会报错。例如:

df = pd.read_csv(file_path, delimiter=' ', names=['Year', 'Mon', 'Day', 'PRE'], error_bad_lines=False)


然而这种做法有一定的风险,因为它可能会导致某些数据被无视。所以在使用这种方法之前,您需要确定这样做不会对您的数据分析产生不良影响。

另一种解决方案是打开文本文件并检查第13行(或者其他导致问题的行),看看是否存在任何显而易见的格式错误。如果存在,您可以手动修复这个问题。或者,如果文件过大或错误太多无法手动修复,您也可以编写代码来自动清理或预处理这些数据。

sfqxx 发表于 2023-7-20 15:37:30

您的代码中只需要做一些小的改动就可以将这些TXT文件中的数据导入为Pandas DataFrame,并在生成Excel文件时添加表头。

在您的代码中,使用pd.read_csv()函数读取TXT文件时,需要添加`names`参数来定义列名。修改后的代码如下:

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)

# 需要添加的列名
column_names = ['Year', 'Mon', 'Day', 'PRE']

for file_path in fujian_files:
    # 使用read_csv读取txt文件,并添加列名
    df = pd.read_csv(file_path, delimiter=' ', names=column_names)
    output_path = os.path.join(output_folder, os.path.basename(file_path).replace('.txt', '.xlsx'))
    df.to_excel(output_path, index=False)

在上述代码中,我们首先定义了列名列表`column_names`,然后在使用`pd.read_csv()`函数加载TXT文件时,我们将`names`参数设置为`column_names`。这样,在加载数据时,Pandas会自动将这些列名分配给加载的数据。

求最佳答案{:10_254:}

王大可2000 发表于 2023-7-20 22:26:42

isdkz 发表于 2023-7-20 15:37
这个错误是由于 pandas 在解析文件时发现了数据的不一致性。具体来说,它期望在第13行看到15个字段,但实 ...

为什么会出现TypeError: read_csv() got an unexpected keyword argument 'error_bad_lines'

sfqxx 发表于 2024-4-13 14:52:12

?
页: [1]
查看完整版本: 提取文件转Excel