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
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)
これは、標準ライブラリだけを使用した非常に大まかな実装です。
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 )
これは、標準ライブラリだけを使用した非常に大まかな実装です。
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