我是Python新手。我需要将程序中的一些数据写入电子表格。我在网上搜索过,似乎有很多可用的软件包(xlwt,XlsXcessive,openpyxl)。其他人建议写一个.csv文件(从不使用CSV而且不太明白它是什么)。
该程序非常简单。我有两个列表(浮点数)和三个变量(字符串)。我不知道两个列表的长度,它们的长度可能不一样。
我希望布局如下图所示:
粉色列将具有第一个列表的值,绿色列将具有第二个列表的值。
那么最好的方法是什么?
P.S。我正在运行Windows 7,但我不一定在运行该程序的计算机上安装Office。
import xlwt
x=1
y=2
z=3
list1=[2.34,4.346,4.234]
book = xlwt.Workbook(encoding="utf-8")
sheet1 = book.add_sheet("Sheet 1")
sheet1.write(0, 0, "Display")
sheet1.write(1, 0, "Dominance")
sheet1.write(2, 0, "Test")
sheet1.write(0, 1, x)
sheet1.write(1, 1, y)
sheet1.write(2, 1, z)
sheet1.write(4, 0, "Stimulus Time")
sheet1.write(4, 1, "Reaction Time")
i=4
for n in list1:
i = i+1
sheet1.write(i, 0, n)
book.save("trial.xls")
我用你所有的建议写了这个。它完成了工作,但可以略微改进。
如何将for循环中创建的单元格(list1值)格式化为科学或数字?
我不想截断这些值。程序中使用的实际值在小数点后大约为10位数。
答案 0 :(得分:111)
使用DataFrame.to_excel中的pandas。 Pandas允许您在功能丰富的数据结构中表示您的数据,并允许您read in excel文件。
您首先必须将数据转换为DataFrame,然后将其保存到excel文件中,如下所示:
In [1]: from pandas import DataFrame
In [2]: l1 = [1,2,3,4]
In [3]: l2 = [1,2,3,4]
In [3]: df = DataFrame({'Stimulus Time': l1, 'Reaction Time': l2})
In [4]: df
Out[4]:
Reaction Time Stimulus Time
0 1 1
1 2 2
2 3 3
3 4 4
In [5]: df.to_excel('test.xlsx', sheet_name='sheet1', index=False)
并且出来的excel文件如下所示:
请注意,两个名单的长度必须相等,否则大熊猫会抱怨。要解决此问题,请使用None
替换所有缺失值。
答案 1 :(得分:82)
import xlwt
def output(filename, sheet, list1, list2, x, y, z):
book = xlwt.Workbook()
sh = book.add_sheet(sheet)
variables = [x, y, z]
x_desc = 'Display'
y_desc = 'Dominance'
z_desc = 'Test'
desc = [x_desc, y_desc, z_desc]
col1_name = 'Stimulus Time'
col2_name = 'Reaction Time'
#You may need to group the variables together
#for n, (v_desc, v) in enumerate(zip(desc, variables)):
for n, v_desc, v in enumerate(zip(desc, variables)):
sh.write(n, 0, v_desc)
sh.write(n, 1, v)
n+=1
sh.write(n, 0, col1_name)
sh.write(n, 1, col2_name)
for m, e1 in enumerate(list1, n+1):
sh.write(m, 0, e1)
for m, e2 in enumerate(list2, n+1):
sh.write(m, 1, e2)
book.save(filename)
了解更多信息: https://github.com/python-excel
答案 2 :(得分:32)
xlrd / xlwt (标准):Python在其标准库中没有此功能,但我认为xlrd/xlwt是读取和写入的“标准”方式excel文件。制作工作簿,添加工作表,编写数据/公式以及格式化单元格相当容易。如果您需要所有这些东西,那么您可以在此库中取得最大成功。我认为你可以选择openpyxl,它会非常相似,但我还没有使用它。
要使用xlwt格式化单元格,请定义XFStyle
并在写入工作表时包含样式。 Here is an example with many number formats。请参阅下面的示例代码。
Tablib (功能强大,直观):Tablib是一个功能更强大但更直观的库,用于处理表格数据。它可以编写具有多个工作表以及其他格式的excel工作簿,例如csv,json和yaml。如果你不需要格式化的单元格(比如背景颜色),那么你可以帮自己使用这个库,从长远来看,这将让你更远。
csv (简单):计算机上的文件是 text 或 binary 。文本文件只是字符,包括换行符和标签等特殊字符,可以在任何地方轻松打开(例如记事本,Web浏览器或Office产品)。 csv文件是以某种方式格式化的文本文件:每行是一个值列表,以逗号分隔。 Python程序可以轻松读写文本,因此csv文件是将数据从python程序导出到excel(或其他python程序)的最简单,最快捷的方法。
Excel文件是二进制的,需要知道文件格式的特殊库,这就是为什么你需要一个额外的python库,或者像Microsoft Excel,Gnumeric或LibreOffice这样的特殊程序来读/写它们。
import xlwt
style = xlwt.XFStyle()
style.num_format_str = '0.00E+00'
...
for i,n in enumerate(list1):
sheet1.write(i, 0, n, fmt)
答案 3 :(得分:10)
CSV代表逗号分隔值。 CSV就像一个文本文件,只需添加.CSV extension
即可创建例如写下这段代码:
f = open('example.csv','w')
f.write("display,variable x")
f.close()
您可以使用excel打开此文件。
答案 4 :(得分:9)
import xlsxwriter
# Create an new Excel file and add a worksheet.
workbook = xlsxwriter.Workbook('demo.xlsx')
worksheet = workbook.add_worksheet()
# Widen the first column to make the text clearer.
worksheet.set_column('A:A', 20)
# Add a bold format to use to highlight cells.
bold = workbook.add_format({'bold': True})
# Write some simple text.
worksheet.write('A1', 'Hello')
# Text with formatting.
worksheet.write('A2', 'World', bold)
# Write some numbers, with row/column notation.
worksheet.write(2, 0, 123)
worksheet.write(3, 0, 123.456)
# Insert an image.
worksheet.insert_image('B5', 'logo.png')
workbook.close()
答案 5 :(得分:6)
尝试查看以下库:
xlwings - 用于从Python获取数据进出电子表格,以及操作工作簿和图表
ExcelPython - 用于在Python而不是VBA中编写用户定义函数(UDF)和宏的Excel加载项
答案 6 :(得分:6)
我调查了一些Python的Excel模块,发现openpyxl是最好的。
免费的书“使用Python自动化无聊的东西has a chapter on openpyxl”,您可以查看Read the Docs网站。您不需要安装Office或Excel即可使用openpyxl。
你的程序看起来像这样:
import openpyxl
wb = openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
stimulusTimes = [1, 2, 3]
reactionTimes = [2.3, 5.1, 7.0]
for i in range(len(stimulusTimes)):
sheet['A' + str(i + 6)].value = stimulusTimes[i]
sheet['B' + str(i + 6)].value = reactionTimes[i]
wb.save('example.xlsx')
答案 7 :(得分:3)
xlsxwriter
库非常适合创建.xlsx
文件。以下代码段从字典列表中生成.xlsx
文件,同时说明顺序和显示的名称:
from xlsxwriter import Workbook
def create_xlsx_file(file_path: str, headers: dict, items: list):
with Workbook(file_path) as workbook:
worksheet = workbook.add_worksheet()
worksheet.write_row(row=0, col=0, data=headers.values())
header_keys = list(headers.keys())
for index, item in enumerate(items):
row = map(lambda field_id: item.get(field_id, ''), header_keys)
worksheet.write_row(row=index + 1, col=0, data=row)
headers = {
'id': 'User Id',
'name': 'Full Name',
'rating': 'Rating',
}
items = [
{'id': 1, 'name': "Ilir Meta", 'rating': 0.06},
{'id': 2, 'name': "Abdelmadjid Tebboune", 'rating': 4.0},
{'id': 3, 'name': "Alexander Lukashenko", 'rating': 3.1},
{'id': 4, 'name': "Miguel Díaz-Canel", 'rating': 0.32}
]
create_xlsx_file("my-xlsx-file.xlsx", headers, items)
?注1-我故意不回答OP提出的确切情况。取而代之的是,我提出了一种大多数访客都希望使用的更为通用的解决方案。该问题的标题在搜索引擎中具有良好的索引,并跟踪大量流量
?注2-如果您不使用Python3.6或更高版本,请考虑在
OrderedDict
中使用headers
。在Python3.6之前,dict
中的顺序未保留。
答案 8 :(得分:1)
OpenPyxl
是一个非常不错的库,用于读取/写入Excel 2010 xlsx / xlsm文件:
https://openpyxl.readthedocs.io/en/stable,指的是使用折旧函数(get_sheet_by_name
)。如果没有它,这是怎么做的:
import openpyxl
wbkName = 'New.xlsx' #The file should be created before running the code.
wbk = openpyxl.load_workbook(wbkName)
wks = wbk['test1']
someValue = 1337
wks.cell(row=10, column=1).value = someValue
wbk.save(wbkName)
wbk.close
答案 9 :(得分:0)
导入确切数字的最简单方法是在l1
和l2
中的数字后面添加小数。 Python会将此小数点解释为您的指示,以包含确切的数字。如果你需要将它限制在某个小数位,你应该能够创建一个限制输出的打印命令,这很简单:
print variable_example[:13]
将数据限制在小数点后十位,假设您的数据有两位小数左边的整数。
答案 10 :(得分:0)
您可以尝试基于hfexcel的XlsxWriter人类友好型面向对象的python库:
from hfexcel import HFExcel
hf_workbook = HFExcel.hf_workbook('example.xlsx', set_default_styles=False)
hf_workbook.add_style(
"headline",
{
"bold": 1,
"font_size": 14,
"font": "Arial",
"align": "center"
}
)
sheet1 = hf_workbook.add_sheet("sheet1", name="Example Sheet 1")
column1, _ = sheet1.add_column('headline', name='Column 1', width=2)
column1.add_row(data='Column 1 Row 1')
column1.add_row(data='Column 1 Row 2')
column2, _ = sheet1.add_column(name='Column 2')
column2.add_row(data='Column 2 Row 1')
column2.add_row(data='Column 2 Row 2')
column3, _ = sheet1.add_column(name='Column 3')
column3.add_row(data='Column 3 Row 1')
column3.add_row(data='Column 3 Row 2')
# In order to get a row with coordinates:
# sheet[column_index][row_index] => row
print(sheet1[1][1].data)
assert(sheet1[1][1].data == 'Column 2 Row 2')
hf_workbook.save()
答案 11 :(得分:0)
如果您需要修改现有工作簿,则最安全的方法是使用pyoo。您需要安装一些库,并且要花一些时间才能完成,但是一旦建立,这将是防弹的,因为您可以利用LibreOffice / OpenOffice的广泛而可靠的API。
请参阅我的Gist,了解如何设置linux系统以及如何使用pyoo进行一些基本编码。
下面是代码示例:
#!/usr/local/bin/python3
import pyoo
# Connect to LibreOffice using a named pipe
# (named in the soffice process startup)
desktop = pyoo.Desktop(pipe='oo_pyuno')
wkbk = desktop.open_spreadsheet("<xls_file_name>")
sheet = wkbk.sheets['Sheet1']
# Write value 'foo' to cell E5 on Sheet1
sheet[4,4].value='foo'
wkbk.save()
wkbk.close()