python2 os.walk(filepath) 出来的路径中的中文变成二进制
时间: 2024-04-09 12:32:52 浏览: 109
在Python 2中,`os.walk`函数返回的路径默认是以系统默认编码方式表示的字符串,如果路径中包含中文字符,而系统默认编码不支持中文字符,则会导致中文字符被转换成二进制数据。
为了解决这个问题,你可以尝试使用`unicode`函数将路径转换为Unicode字符串,以便正确处理中文字符。可以使用以下方式修改代码:
```python
import os
for root, dirs, files in os.walk(filepath):
root = unicode(root, sys.getfilesystemencoding())
for name in files:
name = unicode(name, sys.getfilesystemencoding())
# 执行你的操作
```
注意,`sys.getfilesystemencoding()`函数用于获取系统默认编码方式。
然而,我强烈建议您考虑升级到Python 3,因为Python 2已于2020年停止支持,Python 3对中文字符的处理更加友好和一致。在Python 3中,`os.walk`返回的路径默认为Unicode字符串,无需进行额外的转换操作。
相关问题
for root, dirs, files in os.walk(root_dir): for file in files: if file.endswith('.csv'): # 读取csv文件并将其合并到数据框中 filepath = os.path.join(root, file) csv = pd.read_csv(filepath, encoding='GBK') df = df.append(csv, ignore_index=True)代码怎么加速
在处理大量数据时,可以通过以下几种方式来加速这段代码:
1. 使用多线程或多进程加速读取csv文件的过程。可以使用Python内置的`multiprocessing`模块或第三方库`dask`来实现。
2. 将读取的csv文件转换为二进制格式(如`feather`、`parquet`等),再进行读取。这种方式可以减少IO操作的时间,从而提高读取速度。
3. 对读取到的csv文件进行预处理,如去除不需要的列、转换数据类型等,可以减少后续操作的时间复杂度。
4. 对于较大的csv文件,可以将其切分为多个小文件进行处理,再将结果合并。这种方式可以充分利用多核CPU的并行处理能力。
5. 使用更快的csv文件读取库,如`pandas`的`read_csv()`方法在读取大文件时速度较慢,可以使用`read_csv()`的加速库`cudf`或`dask`的`read_csv()`方法来提高读取速度。
将文件夹及子文件夹中二进制bin文件每8个字节转浮点后,按1、2、3的顺序分别放到csv的1、2、3列后转存到csv,csv放到命名为csv文件夹的目录下,并以bin文件的名字+原始文件这几个字命名,然后在将1、2、3列按照window分别进行特征计算,包括均值、方差、rms、小波1~16的能量值,表头为均值1、均值2、均值3、方差1、方差2、方差3,以此类推,记录在另一个csv文件并以bin文件的名字+特征文件这几个字命名。
以下是按照你的要求进行修改后的示例代码:
```python
import os
import csv
import struct
import numpy as np
import pywt
def calculate_features(data):
features = []
for i in range(3):
features.append(np.mean(data[:, i]))
features.append(np.var(data[:, i]))
for i in range(1, 17):
coeffs = pywt.wavedec(data[:, i % 3], "db4", level=i)
energy = np.sum(np.square(coeffs))
features.append(energy)
return features
# 创建保存CSV文件的文件夹
csv_folder = "csv"
if not os.path.exists(csv_folder):
os.makedirs(csv_folder)
# 遍历文件夹及子文件夹中的二进制bin文件
for root, dirs, files in os.walk(".", topdown=True):
for filename in files:
if filename.endswith(".bin"):
# 构建CSV文件路径
bin_filepath = os.path.join(root, filename)
csv_filename = f"{os.path.splitext(filename)[0]}_原始文件.csv"
csv_filepath = os.path.join(csv_folder, csv_filename)
# 打开二进制bin文件并读取数据
with open(bin_filepath, "rb") as bin_file:
bin_data = bin_file.read()
# 解析二进制数据并转换为浮点数
floats = []
for i in range(0, len(bin_data), 8):
float_value = struct.unpack("d", bin_data[i:i+8])[0]
floats.append(float_value)
# 将数据按顺序分别放到1、2、3列并保存到CSV文件
data = np.array(floats).reshape(-1, 3)
with open(csv_filepath, "w", newline="") as csv_file:
writer = csv.writer(csv_file)
writer.writerow(["1", "2", "3"])
writer.writerows(data)
# 计算特征并保存到特征文件
feature_filename = f"{os.path.splitext(filename)[0]}_特征文件.csv"
feature_filepath = os.path.join(csv_folder, feature_filename)
with open(feature_filepath, "w", newline="") as feature_file:
writer = csv.writer(feature_file)
header = []
for i in range(1, 17):
header.append(f"均值{i}")
header.append(f"方差{i}")
writer.writerow(header)
# 按窗口大小计算特征
window_size = 100
step_size = 50
num_windows = (len(data) - window_size) // step_size + 1
for i in range(num_windows):
window_data = data[i*step_size:i*step_size+window_size]
features = calculate_features(window_data)
writer.writerow(features)
```
这段代码会遍历当前目录及其子目录中的二进制bin文件,将每8个字节转换为浮点数,并将其按顺序放到CSV文件的1、2、3列。然后,它会按照窗口大小和步长计算每个窗口的特征,并将这些特征保存到另一个CSV文件中。最后,所有生成的CSV文件都会保存在一个名为"csv"的文件夹中。
阅读全文