2010-07-13 172 views
51

如何打开一个用于在Python中阅读的Excel文件的文件?如何在Python中打开Excel文件?

我用打开命令打开了文本文件,例如sometextfile.txt。我如何做一个Excel文件?

+1

哪个版本的Excel?如果您可以限制自己打开由Ecel 2007或2010创建的Excel文件,则应该可以将大部分或全部文件解析为XML。 – 2010-07-13 16:30:56

+0

它的excel 2003 :( – novak 2010-07-13 17:00:58

回答

14

这不像打开一个纯文本文件那么简单,并且需要某种外部模块,因为没有内置任何内容来执行此操作。这里有一些选择:

http://www.python-excel.org/

如果可能的话,你可能要考虑导出Excel电子表格为CSV文件,然后使用内置Python的csv模块来阅读:

http://docs.python.org/library/csv.html

+0

好吧我真的不知道CSV的东西我如何让python打开我的excel文件作为csv模块?我有一个程序,做我想要的txt文件,我希望它做对于这个excel文件同样的事情...这是最好的方式去?你能详细说明这个吗? – novak 2010-07-13 17:00:35

+0

你可以使用像xlrd这样的第三方python模块,或者将你的excel文件保存为一个CSV文件,而不是一个普通的Excel文件。我认为你缺少的一点是,一个excel文件与纯文本文件没有相似之处。在记事本中打开Excel文档,你会明白我的意思。您可能需要将文件以CSV(逗号分隔值)等纯文本格式保存,这可以通过python更容易阅读,也可以安装和使用第三方模块来为您解析Excel文件。 – 2010-07-13 17:06:27

+0

我遇到的问题是文件非常大。如果我无法完全打开文件,如何将文件另存为CSV格式? – novak 2010-07-13 17:12:55

28

尝试the xlrd library

[编辑] - 从我可以看到你的评论,像下面的代码片段可能会做的伎俩。我在这里假设你只是在'john'这个单词中搜索一列,但是你可以添加更多或者将它变成一个更通用的函数。

from xlrd import open_workbook 

book = open_workbook('simple.xls',on_demand=True) 
for name in book.sheet_names(): 
    if name.endswith('2'): 
     sheet = book.sheet_by_name(name) 

     # Attempt to find a matching row (search the first column for 'john') 
     rowIndex = -1 
     for cell in sheet.col(0): # 
      if 'john' in cell.value: 
       break 

     # If we found the row, print it 
     if row != -1: 
      cells = sheet.row(row) 
      for cell in cells: 
       print cell.value 

     book.unload_sheet(name) 
+0

我想这可能是我想要它做的: from xlrd import open_workbook book = open_workbook(' ()) if name.endswith('2'): sheet = book.sheet_by_name(name) print sheet.cell_value(0,0) book.unload_sheet(name) large_files.py 但我不希望它使用endwith我希望它找到并打印包含一个particilar名称的行......就像我想要它打印巨大的Excel表格的行,包含约翰的数据而不是鲍勃的数据。帮帮我? – novak 2010-07-13 17:04:16

+0

我建议你发布这个作为一个单独的问题,并将代码放在代码块中。 – 2010-07-13 23:27:45

+0

这是一系列相关问题的第二个问题;在第三个问题中,显示真正的excel文件据称是1.5 GB,并且计算机的内存被描述为“不够”......参见 http://stackoverflow.com/questions/3241039/how-doi-i-使用python提取特定行数据的方法 – 2010-07-14 00:33:18

53

可以使用pandas package以及....

当你与一个Excel工作多张文件,可以使用:

import pandas as pd 
xl = pd.ExcelFile(path + filename) 
xl.sheet_names 

>>> [u'Sheet1', u'Sheet2', u'Sheet3'] 

df = xl.parse("Sheet1") 
df.head() 

df.head()将打印前5行的Excel文件

如果您使用的是带单张工作表的Excel文件,则可以简单地使用:

import pandas as pd 
df = pd.read_excel(path + filename) 
print df.head() 
+2

使用很多工作表时,这是理想的选择。 – 2014-02-26 13:06:16

+2

这个解决方案让我满意。与openpyxl,我遇到了以下问题:“InvalidFileException:openpyxl不支持旧的.xls文件格式,请使用xlrd读取此文件,或将其转换为更新的.xlsx文件格式”。另一方面,熊猫可以处理.xls和.xlsx文件......读取整个表格只需要一行代码。 – nathanielng 2016-02-17 08:00:43

+3

您需要安装可选的依赖关系['xlrd'](https://pypi.python.org/pypi/xlrd)来读取Excel文件,['xlwt'](https://pypi.python.org/ pypi/xlwt)用于编写Excel文件。 – Flimm 2017-02-01 16:19:30

5

其文档还有的openpxyl包:

>>> from openpyxl import load_workbook 
>>> wb2 = load_workbook('test.xlsx') 
>>> print wb2.get_sheet_names() 
['Sheet2', 'New Title', 'Sheet1'] 

>>> worksheet1 = wb2['Sheet1'] # one way to load a worksheet 
>>> worksheet2 = wb2.get_sheet_by_name('Sheet2') # another way to load a worksheet 
>>> print(worksheet1['D18'].value) 
3 
>>> for row in worksheet1.iter_rows(): 
>>>  print row[0].value() 
-3
import pandas as pd 
import os 
files = os.listdir('path/to/files/directory/') 
desiredFile = files[i] 
filePath = 'path/to/files/directory/%s' 
Ofile = filePath % desiredFile 
xls_import = pd.read_csv(Ofile) 

现在你可以使用熊猫DataFrames的力量!

+1

问题是关于读取Excel文件,而不是逗号分隔的文本文件。熊猫似乎有一个函数('pandas.read_excel')。 – Bart 2015-12-02 18:41:03

-1

此代码适用于Python 3.5.2。它打开并保存并超越。我目前正在研究如何将数据保存到文件中,但是这是代码:

import csv 
excel = csv.writer(open("file1.csv", "wb"))