2017-04-13 49 views
0

我写了下面的代码来获取xlsx文件的第四列,并将其保存在csv文件中(如果有的话)。但它给出了以下错误:ValueError: write to closed file写入文件不能在Python 3.5中工作

from __future__ import division, print_function 
import sys 
import numpy as np 
import csv 
import os 
import xlrd 
import csv 
import unicodecsv 

def xls_to_csv1(xls_filename, csv_filename): 
    wb = xlrd.open_workbook(xls_filename) 
    sh = wb.sheet_by_index(0) 

    with open(csv_filename,"wb") as fh: 
     csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';') 

    #print(sh.row_values(1)[3]) 

    for row_number in range (1, sh.nrows): 
     row = [] 
     count=0 
     for col in sh.row_values(row_number): 
       if count==3: 
        row.append(col) 
       count=count+1 
       csv_out.writerow(row) 

xls_filename='Attachment_1_Test_Data_1_Seed.xlsx' 
csv_filename='Summary_csv.csv' 
xls_to_csv1(xls_filename,csv_filename) 
+2

因为'Book'对象没有'.split'方法,所以代码不应该在任何版本的python中运行。将'wb = xlrd.open_workbook(xls_filename).split()'更改为'wb = xlrd.open_workbook(xls_filename)'。 – Abdou

+0

但它在Python 2.7上工作。无论如何,当我删除拆分;它会给出一个令人惊讶的错误:'ValueError:写入封闭文件。但是它是如何关闭的?我以“wb”模式打开它。 – Kristada673

+0

(1)我非常有信心你的问题中显示的代码在Python 2.7中不起作用。如果你确实有Python 2.7的代码,那么你可能没有把它正确地转换成这个问题。 (2)无论如何你想用'split'做什么?你说它在Python 2.7中工作。它在工作时做了什么? –

回答

2

将数据附加到csv文件的过程应在with_statement内完成。这是因为通过所谓的context manager支持with_statement。基本上,这意味着如果您使用with_statement打开文件,则退出with_statement会关闭该文件。这就是为什么你看到closed file错误。以下应该做的:

from __future__ import division, print_function 
import sys 
import numpy as np 
import csv 
import os 
import xlrd 
import csv 
import unicodecsv 

def xls_to_csv1(xls_filename, csv_filename): 
    wb = xlrd.open_workbook(xls_filename) 
    sh = wb.sheet_by_index(0) 

    with open(csv_filename,"wb") as fh: 
     csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';') 
     #print(sh.row_values(1)[3]) 

     for row_number in range (1, sh.nrows): 
      row = [] 
      count=0 
      for col in sh.row_values(row_number): 
       if count==3: 
        row.append(col) 
       count=count+1 
      csv_out.writerow(row) 

我希望这有助于。