帮忙看一下这个python代码,没有报错,正常运行,但功能无法实现(需要实现去除空格、特殊字符,并拆分单元格)
import os
import pandas as pd
# 输入路径和输出路径
input_path = "D:/【科研】/【全学科引文数据集】/test-input"
output_path = "D:/【科研】/【全学科引文数据集】/test-output"
# 获取文件夹中的所有xlsx文件
files = [f for f in os.listdir(input_path) if f.endswith(".xlsx")]
# 遍历每个文件
for file in files:
# 构造文件路径
file_path = os.path.join(input_path, file)
# 读取xlsx文件中的所有表格
xls = pd.read_excel(file_path, sheet_name=None)
# 遍历每个表格
for sheet_name, df in list(xls.items()):
# 删除名为"文献导出—Excel格式"的表格
if sheet_name == "文献导出—Excel格式":
del xls[sheet_name]
# 删除第21列的空格、"[A]. .[C]."和"_x000D_"
if 21 in df.columns:
df.iloc[:, 20] = df.iloc[:, 20].str.replace(' ', '')
df.iloc[:, 20] = df.iloc[:, 20].str.replace(r'\[A\]\.\s\.\[C\]\.', '')
df.iloc[:, 20] = df.iloc[:, 20].str.replace('_x000D_', '')
# 拆分第21列的单元格,并保存拆分结果在第21列及其后面的列中
split_data = df.iloc[:, 20].str.split(".", expand=True)
for i in range(split_data.shape[1]):
df.insert(21 + i, column=f"标准化{i + 1}", value=split_data[i])
# 将剩下的表格保存在原文件中
with pd.ExcelWriter(os.path.join(output_path, file)) as writer:
for sheet_name, df in xls.items():
df.to_excel(writer, sheet_name=sheet_name, index=False)
不知道你这个问题是否已经解决, 如果还没有解决的话:Python 3.5之前将*.pyc
文件通过优化器(-O
)创建的文件,可以略微提升加载速度
Python 3.5 之后已经取消了.pyo
文件的概念,优化后的文件也会以.pyc
文件存储
从.pyc
或.pyo
文件中读取程序比从.py
文件中读取得更快,但只是优化了加载速度,不会优化运行速度
分析和解决方案:
这段代码主要是定义了一个函数split_cell
,该函数的功能是将单元格的内容去除空格和特殊字符,并将其拆分成多个子单元格。
具体步骤如下:
strip()
方法去除单元格内容两端的空格。replace('-', '')
方法将单元格内容中的横杠"-"替换为空字符串,即去除横杠。split()
方法对清理后的单元格内容进行拆分,以空格为分隔符,得到一个子单元格列表。接下来是使用示例,将字符串'example - text'
传递给split_cell
函数,并打印拆分结果。
然而,根据您的问题描述,代码没有达到您想要的结果。因此,我会给出改进的建议。
您的代码中只使用了空格作为拆分符号,导致无法将'example - text'
拆分成['example', 'text']
。要实现您想要的功能,可以考虑使用正则表达式来匹配多个连续的特殊字符作为拆分符号。
以下是改进后的代码示例:
import re
def split_cell(cell_content):
cleaned_content = re.sub(r'[^a-zA-Z0-9\s]', '', cell_content) # 使用正则表达式替换特殊字符为空字符串
return cleaned_content.split()
cell_text = 'example - text'
split_result = split_cell(cell_text)
print(split_result)
改进后的代码使用了re.sub
函数来用空字符串替换特殊字符。r'[^a-zA-Z0-9\s]'
表示匹配除字母、数字和空格之外的任意字符。
通过这样的改进,代码将会把'example - text'
正确地拆分成['example', 'text']
。
希望这样的解决方案能够帮助到您!如果您有任何疑问,请随时提出。
问题点:移除前后空格没有生效
分析思路:原代码无法同时对多列生效.
通过 strip() 函数和 applymap() 函数可以方便地删除单个和多个字符串列中的前后空白,从而在数据处理过程中避免空白带来的影响
代码修改为
# 删除多个字符串列中的前后空白
df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)