编写python脚本以抓取excel数据并写入CSV,如何获得正确的输出?

时间:2018-07-17 22:48:00

标签: python excel csv parsing

我有一个Excel文档,其中包含名为“ foo”的行和名为“ bar”的列。 Foo和bar有时与“ x”关联。

FooBar Tracker Excel Doc

我写了一些python代码,在文档中搜索“ x”,然后列出了相关的foo和bar值。当我仅打印输出时,所有值都将打印到控制台。当我尝试将输出存储为变量并打印该变量时,我仅获得最终的有效foo和bar组合。

import xlrd
import csv

###Grab the data 
def get_row_values(workSheet, row):
    to_return = []
    num_cells = myWorksheet.ncols - 1
    curr_cell = -1
    while curr_cell < num_cells:
        curr_cell += 1
        cell_value = myWorksheet.cell_value(row, curr_cell)
        to_return.append(cell_value)
    return to_return

file_path = 'map_test.xlsx'

myWorkbook = xlrd.open_workbook(file_path)
myWorksheet = myWorkbook.sheet_by_name('Sheet1')
num_rows = myWorksheet.nrows - 1
curr_row = 0
column_names = get_row_values(myWorksheet, curr_row)
print len(column_names)
while curr_row < num_rows:
        curr_row += 1 
        row = myWorksheet.row(curr_row)
        this_row = get_row_values(myWorksheet, curr_row)
        x = 0
        while x <len(this_row):
            if this_row[x] == 'x':
                    #print this_row[0], column_names[x]  
### print this_row[0], column_names[x] works 
### when I un-comment it, and prints foo and bar associated in the 
### proper order
                    output = "[%s %s]" % (this_row[0], column_names[x]) 
            x += 1

print output 
###Using the output variable just outputs the last valid foo/bar 
###combination 

这是为什么?我如何解决它?

第二,当我尝试将数据写入.csv文件时,损坏的输出将添加到.csv中,每个单元格中都有一个字符。我需要能够将每个唯一值放入其自己的单元格,并控制它们进入的单元格。这是我到目前为止的内容:

myData = [["number", "name", "version", "bar" "foo"]]

myFile = open('test123.csv', 'w')
with myFile:
        writer = csv.writer(myFile)
        writer.writerows(myData)
        writer.writerows(output) ###This just outputs the last valid foo 
###and bar combination
print ("CSV Written")

输出最终如下所示: Results I'm getting

但是我希望它看起来像这样: Results I want

1 个答案:

答案 0 :(得分:0)

您的output变量(累加器)不会不断添加值,而是在每次循环运行时都覆盖行,列的值。您的print语句之所以有效,是因为它在每次循环运行时都在打印,这就是您所看到的。

要解决此问题,请将输出变量设置为while循环之外的空列表:

output = []

然后更改此行:

output = "[%s %s]" % (this_row[0], column_names[x]) 

对此:

output.append([this_row[0], column_names[x]]) 

您遇到的另一个问题是您的输出结果很有趣。这是因为此行:

output = "[%s %s]" % (this_row[0], column_names[x]) 

您正在要求python将this_row渲染为字符串,然后在位置[0]处给您一个字符,该字符可能只是“ f”。上面对代码所做的更改也可以解决此问题。

顺便说一句,对此最好使用for循环而不是while循环。例如

for row in range(0,num_rows) :