Python(ではなく)でExcel(XLS)ファイルを読み取る最良の方法は何ですか CSVファイルで)。
このタスクを実行するためにPythonでデフォルトでサポートされている組み込みパッケージはありますか?
Python(ではなく)でExcel(XLS)ファイルを読み取る最良の方法は何ですか CSVファイルで)。
このタスクを実行するためにPythonでデフォルトでサポートされている組み込みパッケージはありますか?
回答:
ファイルの読み取りにはxlrdを強くお勧めし.xls
ます。
voyagerはCOMオートメーションの使用に言及しました。数年前に自分でこれを行ったので、これが本当のPITAであることに注意してください。警告の数は膨大であり、ドキュメントは不足していて煩わしいものです。私は多くの奇妙なバグや落とし穴に遭遇し、そのうちのいくつかは理解するのに何時間もかかりました。
更新:新しい.xlsx
ファイルの場合、読み取りと書き込みに推奨されるライブラリはopenpyxlであるようです(ありがとう、IkarPohorský)。
パンダを使用する:
import pandas as pd
xls = pd.ExcelFile("yourfilename.xls")
sheetX = xls.parse(2) #2 is the sheet number
var1 = sheetX['ColumnName']
print(var1[1]) #1 is the row number...
それらのいずれかを選択できますhttp://www.python-excel.org/
私はpython xlrdライブラリをお勧めします。
使用してインストール
pip install xlrd
インポート
import xlrd
ブックを開く
workbook = xlrd.open_workbook('your_file_name.xlsx')
名前でシートを開く
worksheet = workbook.sheet_by_name('Name of the Sheet')
インデックスでシートを開く
worksheet = workbook.sheet_by_index(0)
セル値を読み取る
worksheet.cell(0, 0).value
パンダが一番いい方法だと思います。Pandas 関数を使用してここにすでに1つの答えがありExcelFile
ますが、私には適切に機能しませんでした。ここから私はread_excel
うまく機能する機能を見つけました:
import pandas as pd
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name")
print(dfs.head(10))
PS機能を動作xlrd
させるには、インストールが必要ですread_excel
更新21-03-2020:ここに表示されているように、xlrd
エンジンに問題があり、廃止される予定です。openpyxl
最良の代替品です。したがって、ここで説明するように、正規構文は次のようになります。
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name", engine="openpyxl")
xlsxについては、以前にhttps://web.archive.org/web/20180216070531//programming/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'): # Example: <v>84</v>
value = el.text
if el.tag.endswith('}c'): # Example: <c r="A3" t="s"><v>84</v></c>
if el.attrib.get('t') == 's':
value = strings[int(value)]
letter = el.attrib['r'] # Example: AZ22
while letter[-1].isdigit():
letter = letter[:-1]
row[letter] = value
value = ''
if el.tag.endswith('}row'):
rows.append(row)
row = {}
return rows
追加された改善点は、シート名でコンテンツをフェッチし、reを使用して列を取得し、共有文字列が使用されているかどうかを確認することです。
def xlsx(fname,sheet):
import zipfile
from xml.etree.ElementTree import iterparse
import re
z = zipfile.ZipFile(fname)
if 'xl/sharedStrings.xml' in z.namelist():
# Get shared strings
strings = [element.text for event, element
in iterparse(z.open('xl/sharedStrings.xml'))
if element.tag.endswith('}t')]
sheetdict = { element.attrib['name']:element.attrib['sheetId'] for event,element in iterparse(z.open('xl/workbook.xml'))
if element.tag.endswith('}sheet') }
rows = []
row = {}
value = ''
if sheet in sheets:
sheetfile = 'xl/worksheets/sheet'+sheets[sheet]+'.xml'
#print(sheet,sheetfile)
for event, element in iterparse(z.open(sheetfile)):
# get value or index to shared strings
if element.tag.endswith('}v') or element.tag.endswith('}t'):
value = element.text
# If value is a shared string, use value as an index
if element.tag.endswith('}c'):
if element.attrib.get('t') == 's':
value = strings[int(value)]
# split the row/col information so that the row leter(s) can be separate
letter = re.sub('\d','',element.attrib['r'])
row[letter] = value
value = ''
if element.tag.endswith('}row'):
rows.append(row)
row = {}
return rows
ここにリストされている任意のライブラリ(JExcelApiに基づくPyxlreaderやxlwtなど)と、ファイルの読み取りにExcel自体を使用するCOMオートメーションを使用できますが、ソフトウェアの依存関係としてOfficeを導入しています。これは常にオプションとは限りません。
xlwt
WriTesファイル。xlrd
ReaDファイルに使用します。
古いXLS形式が必要な場合。以下のansii 'cp1251'のコード。
import xlrd
file=u'C:/Landau/task/6200.xlsx'
try:
book = xlrd.open_workbook(file,encoding_override="cp1251")
except:
book = xlrd.open_workbook(file)
print("The number of worksheets is {0}".format(book.nsheets))
print("Worksheet name(s): {0}".format(book.sheet_names()))
sh = book.sheet_by_index(0)
print("{0} {1} {2}".format(sh.name, sh.nrows, sh.ncols))
print("Cell D30 is {0}".format(sh.cell_value(rowx=29, colx=3)))
for rx in range(sh.nrows):
print(sh.row(rx))
Python Exceleratorもこのタスクを処理します。http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/
DebianとUbuntuでも利用できます。
sudo apt-get install python-excelerator
(非Python)プログラムxls2csvの実行も検討してください。xlsファイルをフィードすると、csvが返されます。
xls2csv
てcsv
からPythonから解析することを提案していますか?
古いExcelファイルには、使用されているOLE構造化ストレージ形式を読み取ることができるOleFileIO_PLモジュールがあります。
with open(csv_filename) as file:
data = file.read()
with open(xl_file_name, 'w') as file:
file.write(data)
組み込みのパッケージを使用して、上記のようにCSVをExcelに変換できます。CSVはdictreaderとdictwriterの組み込みパッケージで処理でき、Python辞書と同じように機能します。これにより、非常に簡単になりました。現在、組み込みのExcel用パッケージを認識していませんが、openpyxlに遭遇しました。また、これは非常に単純明快でシンプルでした
import openpyxl
book = openpyxl.load_workbook(filename)
sheet = book.active
result =sheet['AP2']
print(result.value)