【问题标题】:Read in .xlsx with csv module in python在 python 中使用 csv 模块读取 .xlsx
【发布时间】:2016-06-15 03:38:54
【问题描述】:

我正在尝试使用 csv 模块读取具有 .xlsx 格式的 excel 文件,但在使用 excel 文件时,即使指定了我的方言和编码,我也没有任何运气。下面,我展示了我尝试的不同编码的不同尝试和错误结果。如果有人能指出我可以用来在 Python 中读取 .xlsx 文件的正确编码、语法或模块,我将不胜感激。

使用以下代码,我收到以下错误:_csv.Error: line contains NULL byte

#!/usr/bin/python

import sys, csv

with open('filelocation.xlsx', "r+", encoding="Latin1")  as inputFile:
    csvReader = csv.reader(inputFile, dialect='excel')
    for row in csvReader:
        print(row)

使用以下代码,我收到以下错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 16: invalid continuation byte

#!/usr/bin/python

import sys, csv

with open('filelocation.xlsx', "r+", encoding="Latin1")  as inputFile:
    csvReader = csv.reader(inputFile, dialect='excel')
    for row in csvReader:
        print(row)

当我在encoding 中使用utf-16 时,出现以下错误:UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 570-571: illegal UTF-16 surrogate

【问题讨论】:

  • 您无法使用 csv 模块读取 xlsx 文件。 Excel 方言仅表示您可以读取使用 Excel 创建的 CSV 文件。
  • 你知道有哪些模块可以读取 .xlsx 文件吗?
  • 您可以使用 Google 搜索找到很多模块,但您应该测试它们是否适合您的用例。
  • 问题的编辑是无可挑剔的,它真的帮助了我,即使没有阅读任何答案。谢谢。

标签: python excel encoding utf-8


【解决方案1】:

您不能使用 Python 的 csv 库来读取 xlsx 格式的文件。您需要安装和使用不同的库。例如,您可以使用openpyxl,如下所示:

import openpyxl

wb = openpyxl.load_workbook("filelocation.xlsx")
ws = wb.active

for row in ws.iter_rows(values_only=True):
    print(row)

这会将文件中的所有行显示为行值列表。 Python Excel 网站提供了其他可能的示例。


或者,您可以创建一个行列表:

import openpyxl

wb = openpyxl.load_workbook("filelocation.xlsx")
ws = wb.active

data = list(ws.iter_rows(values_only=True))

print(data)

注意:如果您使用的是旧版 Excel 格式 .xls,则可以改用 xlrd 库。这不再支持.xlsx 格式。

import xlrd

workbook = xlrd.open_workbook("filelocation.xlsx")
sheet = workbook.sheet_by_index(0)
data = [sheet.row_values(rowx) for rowx in range(sheet.nrows)]

print(data)

【讨论】:

  • 我喜欢你推荐的xlrd,因为我相信它是最好的 Excel 阅读器。但是,如果您想要一个连续的值列表,那么通过简单的cols = sheet.row_values(row) 而不是您的列表理解更容易(并且可能更有效)完成。另外,我建议为行 index 使用其他名称(我偏爱rx;您会看到很多示例使用rowx),因为名称row 经常引用一行对象
  • 您不能再在 xlsx 文件上使用 xlrd 链接文本

    也可以读取 xlsx 文件

    (不是推荐,除非您有充分的理由坚持使用 xlrd)
    在处理之前手动将文件转换为 xls

    (推荐)
    按照推荐使用较新的 openpyxl python 模块
【解决方案2】:

这是一个仅使用标准库的非常粗略的实现。

def xlsx(fname, sheet=1):
    import zipfile
    from xml.etree.ElementTree import iterparse
    z = zipfile.ZipFile(fname)
    strings = [el.text for e, el in iterparse(z.open('xl/sharedStrings.xml')) if el.tag.endswith('}t')]
    rows = []
    row = {}
    value = ''
    for e, el in iterparse(z.open('xl/worksheets/sheet%s.xml' % sheet)):
        if el.tag.endswith('}v'):  # <v>84</v>
            value = el.text
        if el.tag.endswith('}c'):  # <c r="A3" t="s"><v>84</v></c>
            if el.attrib.get('t') == 's':
                value = strings[int(value)]
            column_name = ''.join(x for x in el.attrib['r'] if not x.isdigit())  # AZ22
            row[column_name] = value
            value = ''
        if el.tag.endswith('}row'):
            rows.append(row)
            row = {}
    return rows

(这是从已删除的问题中复制的:https://stackoverflow.com/questions/4371163/reading-xlsx-files-using-python

【讨论】:

    【解决方案3】:

    这是一个仅使用标准库的非常粗略的实现。

    def xlsx(fname):
        import zipfile
        from xml.etree.ElementTree import iterparse
        z = zipfile.ZipFile(fname)
        strings = [el.text for e, el in iterparse(z.open('xl/sharedStrings.xml')) if el.tag.endswith('}t')]
        rows = []
        row = {}
        value = ''
        for e, el in iterparse(z.open('xl/worksheets/sheet1.xml')):
            if el.tag.endswith('}v'):  # <v>84</v>
                value = el.text
            if el.tag.endswith('}c'):  # <c r="A3" t="s"><v>84</v></c>
                if el.attrib.get('t') == 's':
                    value = strings[int(value)]
                letter = el.attrib['r'] # AZ22
                while letter[-1].isdigit():
                    letter = letter[:-1]
                row[letter] = value
                value = ''
            if el.tag.endswith('}row'):
                rows.append(row)
                row = {}
        return rows
    

    此答案复制自已删除的问题:https://stackoverflow.com/a/22067980/131881

    【讨论】:

      【解决方案4】:

      您不能使用 Python 的 csv 库来读取 .xlsx 格式的文件。您也不能使用讽刺的“pd.read_excel”(它只支持.xls)。下面是我创建的用于导入 .xlsx 的函数。它在您导入的文件的第一行分配列名称。非常直接。

      def import_xlsx(filepath):
          wb=openpyxl.load_workbook(filename=filepath, data_only=True)
          ws = wb.active
          df = list(ws.iter_rows(values_only=True))
          new=pd.DataFrame(data=df)
          new1=new[1:]
          new1.columns=new[0:1].values[0].tolist()
          return(new1)
      

      例子:

      new_df=import_xlsx('C:\\Users\big_boi\\documents\\my_file.xlsx')
      

      【讨论】:

        猜你喜欢
        • 2017-12-07
        • 1970-01-01
        • 1970-01-01
        • 2015-01-24
        • 1970-01-01
        • 2020-12-24
        • 2018-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多