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

Python 使用Openpyxl对xlsx文件进行条件解析和输出,python,csv,python-3.x,xlsx,openpyxl,Python,Csv,Python 3.x,Xlsx,Openpyxl,我正在为一个研究项目整理数据。输出格式为.csv文件,已转换为.xlsx文件。每个参与者都有一个单独的输出文件,每个文件包含几十个(或更多)刺激的大约40个不同测量的数据。为了理解收集到的数据,我们需要分别观察每个刺激和相关的测量值。每个输出文件都很大(50列乘以60000行)。我希望使用openpyxl解析数据库,以在预先指定的列中搜索具有特定字符串值的单元格。找到此类单元格后,将该单元格与同一行中的其他指定列一起写入新工作簿 A B C D

我正在为一个研究项目整理数据。输出格式为.csv文件,已转换为.xlsx文件。每个参与者都有一个单独的输出文件,每个文件包含几十个(或更多)刺激的大约40个不同测量的数据。为了理解收集到的数据,我们需要分别观察每个刺激和相关的测量值。每个输出文件都很大(50列乘以60000行)。我希望使用openpyxl解析数据库,以在预先指定的列中搜索具有特定字符串值的单元格。找到此类单元格后,将该单元格与同一行中的其他指定列一起写入新工作簿

    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
例如,在解析下表时,我尝试使用openpyxl搜索列A中的“幻灯片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
将写:

    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的文档,但没有结果。这里的论坛上似乎也没有类似的问题

任何关于正确操作和写入数据的见解都将不胜感激。我也希望这能帮助其他人理解庞大的数据集。提前谢谢

我在Windows7上运行Python3.3.2(64位)和openpyxl-1.6.2。数据最初是.csv格式的,因此如果有帮助,可以导出为.xls或其他格式。我简要地研究了XLUTIL(使用xlwt和xlrd),但openpyxl在处理xlsx文件时效果更好


编辑

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

我现在有以下内容,但它仍然返回一个空工作簿。原始单元格不是空的。(注释行是为了简化,当然没有缩进,但是代码无论如何都不成功。)


编辑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调用函数提取输入工作簿每个单元格中的文本,并将其设置为导出工作簿中所需的单元格

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')

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

您需要打开第二个笔记本进行书写:

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)

您的单元格分配不正确。以下是应该采取的措施:

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')

谢谢这更有意义。但是仍然有一个空的输出。请看这一行
ws\u out.cell('cell index here')。value=所需的\u值
。您需要分配一个新值。更换整个
单元
不起作用。您需要以相同的方式从输入文件中提取值
ws_in.cell('cell index here')。value
。谢谢!我错过了一个等号和.value。我做了更改,但它仍然返回一个空白工作簿。嗯,它适合我。看起来像是
ws.cell(行=x,列=27)。value='7.image2.jpg'
不起作用。你能把它注释掉,看看输出文件中是否会有一些数据吗?它可以工作!当我注释掉建议的行时,我想再次检查我的列编号。我忘了从0开始。非常感谢!