2015-02-26 2 views
1

Я относительно новичок в программировании, и я хотел создать немного кода Python, который просто ищет и заменяет их точкой, на определенные числа и последовательности символов. он должен работать на больших файлах. поэтому я придумал это.ValueError: операция ввода-вывода в закрытом файле python

import re 


f = open('filein.txt','r') 
o = open ('fileout4.txt','w') 

newdata=f.read() 
rc=re.compile('(?<=..\d)[,]') 
for line in newdata: 
     newdataline=newdata 
     newline = rc.sub('.',newdata) 
     o.write(newline) 
     f.close() 
     o.close() 
f.close() 
o.close() 

похоже на работу, но я все еще получаю это сообщение об ошибке.

File "C:\Python34\replace comma to dot usingresubtestnewlinecharacter.py", line 12, in ? 
    o.write(newline) 
ValueError: I/O operation on closed file 

может помочь здесь?

ответ

2

Удалите close заявления для цикла

for line in newdata: 
     newdataline=newdata 
     newline = rc.sub('.',newdata) 
     o.write(newline) # This is fine, remove the next two close statements! 

файлы замкнуты в самой первой итерации! Вот почему при следующем запуске цикла вы получите сообщение об ошибке.

Или - Как вы предпочитаете делать

for line in newdata: 
     newdataline=newdata 
     newline = rc.sub('.',newdata) 
     o = open ('fileout4.txt','w') # Open the file inside the loop (I prefer 'a' instead of 'w') 
     o.write(newline)    
     o.close()      # Get rid of f.close() 
f.close() 
+0

спасибо за ваш ответ, однако, если я это сделать, оболочка принимает навсегда для выполнения на файл 20Mb. если я закрою файл, как я сделал, прежде чем он появится, чтобы работать – Tom365

+0

Я боюсь, что программа все еще висит, если я реализую ее так, как вы предлагали. ваш код работает с меньшими файлами, т.е. 100 kb, и хотя мое первое предложение дает сообщение об ошибке в более крупных файлах, 20mb, оно все равно предоставляет мне выход. есть ли другой способ написать этот код эффективным способом? – Tom365

+0

@ Tom365 Bro, это самый эффективный способ решения. Однако вы хотите, чтобы он был более эффективным, я предлагаю вам задать другой вопрос! Я ответил на этот вопрос и помог вам удалить «ValueError», который у вас есть. Я понимаю вашу ситуацию, так как даже я работал над большими данными, а регулярное выражение python очень медленное !. –

Смежные вопросы