Python 2.7转3.6代码移植问题:CSV读取代码无法运行
适配Python 3.6的CSV数据加载代码修改方案
看起来你这段Python2.7的CSV加载代码在Python3.6里跑不通,主要是因为两个版本在文件IO、文本处理上的差异,我帮你调整一下,同时修正代码里的小问题:
核心问题分析
- 文件打开模式:Python2里用
'rb'二进制模式没问题,但Python3的csv.reader需要处理文本流,二进制模式会导致读取的内容是字节串而非字符串,引发类型错误。 - 换行符处理:Python3的
csv模块推荐打开文件时指定newline='',避免不同系统下换行符被错误转换。 - 编码问题:Python3默认使用utf-8编码读取文件,如果你的CSV是其他编码(比如Windows常用的cp1252),需要明确指定,否则会出现解码失败。
- 切片语法错误:原代码里的
iloc[1:...是不完整的写法,Python3里应该写成iloc[1:]。
修改后的完整代码
def load_new_data(self): full = list() # 根据你的CSV实际编码调整,比如utf-8、cp1252、gbk等 with open(self.filename, 'r', encoding='utf-8', newline='') as csv_in: myreader2 = csv.reader(csv_in, delimiter=';') count = 0 headers = [] for row in myreader2: if count == 0: headers = row[1:] count += 1 elif count == 1: # 跳过第二行数据 count += 1 else: current_row = row[1:-1] full.append(current_row) count += 1 new_df = pd.DataFrame.from_records(full, columns=headers) # 修正切片语法,移除多余的省略号 new_df = new_df.iloc[1:] return new_df
关键修改说明
- 文本模式+编码指定:用
'r'文本模式替代'rb',同时显式指定编码,确保CSV里的特殊字符能正确解码。 - newline参数:
newline=''让csv模块自己处理换行符,避免在Windows系统下出现多余的空行或解析错误。 - 变量初始化:提前初始化
headers列表,让代码逻辑更清晰,避免潜在的未定义变量警告。 - 修正切片语法:把不完整的
iloc[1:...改成iloc[1:],确保正确跳过DataFrame的第一行数据。
如果运行时还是出现编码错误,你可以把encoding='utf-8'换成CSV文件实际的编码(比如用记事本打开CSV,另存为时查看编码)。
内容的提问来源于stack exchange,提问作者Emiliano Fraticelli
相关产品推荐
相关产品推荐

