Python 2.7(Anaconda发行版):如何解析含混合换行符(\n与\r\n)的文本文件
解决Python 2.7中CSV文件混合行终止符的问题
在Python 2.7里处理混合了\n和\r\n行终止符的CSV文件,确实会遇到这种让人头疼的情况。我来给你分析下问题原因,再提供几个可行的解决方案:
问题根源
- 用
rb二进制模式打开时,文件不会自动转换任何换行符,csv.reader在处理二进制数据时,可能无法将\r\n识别为统一的行终止符,只会把\n当成换行标记。 - 用
rU通用换行模式时,虽然文件对象会把所有行终止符(\r、\n、\r\n)都转换成\n,但在某些场景下(比如系统默认换行符设置的干扰),csv.reader可能没有正确适配这种转换,导致单独的\n无法被识别。
解决方案1:统一转换行终止符(最稳妥)
先读取整个文件内容,把所有\r\n替换成\n,再用StringIO模拟文件对象传给csv.reader。这样不管原文件用哪种换行符,都能统一成\n,确保csv.reader正确识别每一行:
import csv from cStringIO import StringIO with open(infile, 'rb') as f: # 读取全部内容并统一换行符 file_content = f.read().replace('\r\n', '\n') # 用StringIO把字符串转成类文件对象 reader = csv.reader(StringIO(file_content), delimiter='|') # 现在可以正常遍历reader了 for row in reader: print(row)
解决方案2:手动适配csv.reader参数(备选)
虽然csv.reader的lineterminator参数主要是给写入操作设计的,但结合rU模式,显式设置相关参数也能解决部分场景的问题(兼容性略逊于方案1):
import csv with open(infile, 'rU') as f: reader = csv.reader(f, delimiter='|', lineterminator='\n') for row in reader: print(row)
优先推荐方案1,它直接从根源上统一了换行符,避免了不同模式或csv模块版本带来的兼容性问题。
内容的提问来源于stack exchange,提问作者eric s
相关产品推荐
相关产品推荐

