web-dev-qa-db-ja.com

pythonのcsvモジュールで.xlsxを読み取ります

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)

encodingutf-16を使用すると、次のエラーが発生します:UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 570-571: illegal UTF-16 surrogate

11
pHorseSpec

Pythonのcsvライブラリを使用してxlsx形式のファイルを読み取ることはできません。別のライブラリをインストールして使用する必要があります。たとえば、次のようにxlrdを使用できます。

import xlrd

workbook = xlrd.open_workbook("filelocation.xlsx")
sheet = workbook.sheet_by_index(0)

for rowx in range(sheet.nrows):
    cols = sheet.row_values(rowx)
    print(cols)

これにより、ファイルのすべての行が列のリストとして表示されます。 Python Excel Webサイトは、他の可能な例を示しています。


または、行のリストを作成することもできます。

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)
19
Martin Evans

これは、標準ライブラリだけを使用した非常に大まかな実装です。

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

1
Collin Anderson

これは、標準ライブラリだけを使用した非常に大まかな実装です。

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

0
Collin Anderson