使用Openpyxl进行xlsx文件的条件解析和输出

3
我正在处理一个研究项目的数据。输出以.csv格式文件的形式呈现,已转换为.xlsx文件。每个参与者都有一个单独的输出文件,每个文件包含约40个不同的测量值,涉及数十个(左右)刺激。要理解收集到的数据,我们需要分别查看每个刺激,带有相关联的测量值。每个输出文件都很大(50列×60000行)。我想使用openpyxl解析数据库,搜索预先指定列中具有特定字符串值的单元格。找到这样的单元格后,将该单元格写入新工作簿,并将同一行中的其他指定列的值一起写入。例如,解析以下表格,我试图使用openpyxl在A列中搜索"Slide 2"。当找到某个特定行的这个值时,该单元格会与同一行中C和D列的值一起写入新的工作簿。
    A          B       C       D

1   Slide      Data1   Data2   Data3

2   Slide 1    1       2       3

3   Slide 2    4       5       6

4   Slide 2    7       8       9

Would write:

    A          B       C       D

2   Slide 2    5       6

3   

4   

...或类似的格式。

我还希望从下一个文件中填充D列和E列的数据,从其后一个文件中填充F列和G列的数据(以此类推),但我可能可以自己解决这一部分。

我尝试过:

from openpyxl import load_workbook

wb = load_workbook(filename = r'test108.xlsx')

ws = wb.worksheets[0]

dest_filename = r'output.xlsx'

for x in range (0, 100): #0-100 as proof of concept before parsing entire worksheet
    if ws.cell(row = x, column =26) == ‘some_image.jpg':
        print (ws.cell(row =x, column =26), ws.cell(row = x, column = 10), ws.cell(row = x, column = 17))

wb.save = dest_filename

此外,您可以尝试添加以下内容来在内存中创建一个工作表以操纵单元格:
for i in range (0, 30):
    for j in range (0, 100):
        print (ws.cell(row =i, column=j))

...两者都有一些小的变化,但它们都输出原始文件的副本。

我已经反复阅读了openpyxl的文档,但没有任何效果。这里的论坛上也没有类似的问题。

正确操作和编写数据方面的任何见解都将不胜感激。我也希望这可以帮助其他试图理解大型数据集的人。提前致谢!

我在运行Python3.3.2(64位)和openpyxl-1.6.2的Windows 7上。数据最初是以.csv格式存在,因此如果有所帮助,可以将其导出为.xls或其他格式。我简要地研究了xlutils(使用xlwt和xlrd),但openpyxl与xlsx文件更兼容。


编辑

非常感谢@MikeMüller指出我需要两个工作簿来在之间传输数据。这更有意义。

现在我有以下内容,但仍然返回一个空白工作簿。原始单元格并不为空。(注释行用于简化 - 当然没有缩进,但代码也无法成功。)

import openpyxl

wb = openpyxl.load_workbook(filename = r'test108.xlsx')
ws = wb.worksheets[0]

wb_out = openpyxl.Workbook()
ws_out = wb_out.worksheets[0]

#n = 1

#for x in range (0, 1000):
    #if ws.cell(row = x, column = 27) == '7.image2.jpg':
        ws_out.cell(row = n, column = 1) == ws.cell(row = x, column = 26) #x changed
        ws_out.cell(row = n, column = 2) == ws.cell(row = x, column = 10) #x changed
        ws_out.cell(row = n, column = 3) == ws.cell(row = x, column = 17) #x changed
        #n += 1

wb_out.save('output108.xlsx')

编辑2

我已更新代码,包括单元格的.value属性,但仍返回空工作簿。

import openpyxl

wb = openpyxl.load_workbook(filename = r'test108.xlsx')
ws = wb.worksheets[0]

wb_out = openpyxl.Workbook()
ws_out = wb_out.worksheets[0]

n = 1

for x in range (0, 1000):
    if ws.cell(row=x, column=27).value == '7.Image001.jpg':
        ws_out.cell(row=n, column=1).value = ws.cell(row=x, column=27).value
        ws_out.cell(row=n, column=2).value = ws.cell(row=x, column=10).value
        ws_out.cell(row=n, column=3).value = ws.cell(row=x, column=17).value
        n += 1

wb_out.save('output108.xlsx')

下一位有困难的人概述:

你需要在内存中创建两个工作表。一个用于导入文件,另一个用于将数据写入新的工作簿文件。

使用cell.value函数调用来提取导入工作簿中每个单元格中输入的文本,并将其设置为要导出到工作簿的所需单元格。

确保从零开始计算行和列。

2个回答

3
您需要打开第二个笔记本进行编写:
import openpyxl
wb_out = openpyxl.Workbook(dest_filename)
ws_out = wb_out.worksheets[0]

将以下代码放入循环中:

ws_out.cell('cell indices here').value = desired_value

保存您的文件:

writer = openpyxl.ExelWriter(workbook=wb_out)
writer.save(dest_filename)

谢谢!现在更有意义了。但是输出仍然为空。 - Jonathan
看这一行代码:ws_out.cell('cell indices here').value = desired_value。你需要给它赋一个新的值。替换整个 cell 是不起作用的。你需要以与 ws_in.cell('cell indices here').value 相同的方式从输入文件中提取值。 - Mike Müller

3

您正在错误地进行单元分配。以下是应该起作用的方法:

import openpyxl

wb = openpyxl.load_workbook(filename = r'test108.xlsx')
ws = wb.worksheets[0]

wb_out = openpyxl.Workbook()
ws_out = wb_out.worksheets[0]

n = 1

for x in range (0, 1000):
    if ws.cell(row=x, column=27).value == '7.image2.jpg':
        ws_out.cell(row=n, column=1).value = ws.cell(row=x, column=26).value #x changed
        ws_out.cell(row=n, column=2).value = ws.cell(row=x, column=10).value #x changed
        ws_out.cell(row=n, column=3).value = ws.cell(row=x, column=17).value #x changed
        n += 1

wb_out.save('output108.xlsx')

谢谢!我错过了单个等号和.value。我做出了更改,但它仍然返回一个空白工作簿。 - Jonathan
嗯,对我来说它是有效的。看起来 ws.cell(row=x, column=27).value == '7.image2.jpg' 不起作用。你能把它注释掉并查看输出文件中是否有一些数据吗? - alecxe
它有效了!当我注释掉建议的那行时,我想再次检查我的列编号。我忘记从0开始了。非常感谢! - Jonathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接