读取 csv 函数以在 python2 和 python3 中工作(unicode -vs bytes-like object)

Posted

技术标签:

【中文标题】读取 csv 函数以在 python2 和 python3 中工作(unicode -vs bytes-like object)【英文标题】:read csv function to work in both python2 and python3 (unicode -vs bytes-like object) 【发布时间】:2022-01-08 00:20:57 【问题描述】:

在迁移到 python3 和 rhel8 时,我们需要维护一个遗留应用程序。

因此,我们必须创建一个向后兼容的版本。

有一个读取 csv 的函数。

在 python3 中我们有这个:

from io import StringIO
import csv

def read_csv(filename):
    """
    Sanitise and read CSV report
    """

    # lowest number of columns to expect in the header
    sane_columns = 7

    # temporary sanitised CSV
    stream = StringIO()

    with open(filename, encoding="utf-8") as csvfile:
        reader = csv.reader(csvfile)
        temp_writer = csv.writer(stream)
        for csv_row in reader:
            if len(csv_row) >= sane_columns:
                temp_writer.writerow(csv_row)

    # Move stream back to the start
    stream.seek(0)

    dict_reader = csv.DictReader(stream)

    return dict_reader

在 python2 上,这会出现以下错误:

TypeError: unicode argument expected, got 'str'

然后我们将代码更改为在 python2 中工作:

from io import BytesIO
import csv

def read_csv(filename):
    """
    Sanitise and read CSV report
    """

    # lowest number of columns to expect in the header
    sane_columns = 7

    # temporary sanitised CSV
    stream = BytesIO()

    with open(filename) as csvfile:
        reader = csv.reader(csvfile)
        temp_writer = csv.writer(stream)
        for csv_row in reader:
            if len(csv_row) >= sane_columns:
                temp_writer.writerow(csv_row)

    # Move stream back to the start
    stream.seek(0)

    dict_reader = csv.DictReader(stream)

    return dict_reader

但是在 python3 上它给出了这个错误:

TypeError: a bytes-like object is required, not 'str'

我们如何重构它将在两个版本的python(2.7+和3.6+)上运行的函数

需要解析的csv有一些垃圾行,这里是一个示例:

some
garbage
lines


Client Name,Policy Name,Status Code,Job Start Time,Job End Time,Job Status,Schedule Name,Schedule Type
xxxxx,WN4_VMWARE_3M,0,"Nov 28, 2021 9:07:38 PM","Nov 28, 2021 9:38:38 PM",Successful,DI3M,Differential Incremental
yyyyyy,WN4_VMWARE_3M,0,"Nov 28, 2021 9:04:52 PM","Nov 28, 2021 9:30:38 PM",Successful,DI3M,Differential Incremental

作为额外的挑战。我不能使用六库。不允许在服务器上安装 pip 包:(

【问题讨论】:

【参考方案1】:

我会使用这种方法来检测安装了哪个版本,如果是一个版本做某事,如果不是,做其他事情:

import sys
print(sys.version_info[0]) 
if sys.version_info[0] < 3:
    #block of code
else:
    #block of code

【讨论】:

【参考方案2】:

我不确定正确的解决方案。但是,我们曾经遇到过类似的问题,其中我们提到的编码格式是“utf-8”,但是一位同事使用 Excel 保存了文件,将文件转换为其他格式,然后第二个错误开始弹出。尝试以正确的 csv 格式保存文件。和平!

【讨论】:

以上是关于读取 csv 函数以在 python2 和 python3 中工作(unicode -vs bytes-like object)的主要内容,如果未能解决你的问题,请参考以下文章

django 无法读取 csv 文件以在 javascript 和 html 模板中绘制 highchart

将 .csv 文件读取为 read.transactions 以在 R 中应用 ariori()?

读取由 s3 事件触发的文件

python3中使用使用read_csv( )读取csv文件,文件路径中含有中文,无法读取怎么处理?

使用 Python 读取 UTF8 CSV 文件

Python 2.7 csv 模块仅 498 项