2015-06-27 5 views
1

Очень новый для Python и программирования в целом, так извиняйтесь, если я пропущу что-нибудь прямое.Проблема поиска файла в списке, который будет переписан

Я пытаюсь выполнить итерацию по каталогу и открыть прилагаемые .txt-файлы и изменить их с помощью нового содержимого.

import os 

def rootdir(x): 
    for paths, dirs, files in os.walk(x): 
     for filename in files: 
      f=open(filename, 'r') 
      lines=f.read() 
      f.close() 
      for line in lines: 
       f=open(filename, 'w') 
       newline='rewritten content here' 
       f.write(newline) 
       f.close() 
return x 

rootdir("/Users/russellculver/documents/testfolder")` 

дает мне: IOError: [Errno 2] Нет такого файла или каталога: 'TestText1.rtf'

EDIT: Я хотел уточнить есть файл с именем 'TestText1.rtf' в папку, указанную в аргументе функции. Это первый из трех текстовых файлов.

Когда я пытаюсь двигаться, когда файл закрыт/открыт, как показано ниже:

import os 

def rootdir(x): 
    for paths, dirs, files in os.walk(x): 
     for filename in files: 
      f=open(filename, 'r+') 
      lines=f.read() 
      for line in lines: 
        newline='rewritten content here' 
        f.write(newline) 
        f.close() 
return x 

rootdir("/Users/russellculver/documents/testfolder") 

Это дает мне: ValueError: операции ввода/вывода в закрытом файле

Спасибо за любые мысли заранее ,

@mescalinum Итак, я внесла поправки в то, что у меня основано на любой помощи (спасибо!), Но он все еще не в состоянии ввести текст «новая строка» в любом из TXT-файлов в указанном папка.

import os 

x = raw_input("Enter the directory here: ") 

def rootdir(x): 
    for dirpaths, dirnames, files in os.walk(x): 
     for filename in files: 
      try: 
       with open(os.dirpaths.join(filename, 'w')) as f: 
        f.write("newline") 
       return x 
      except: 
       print "There are no files in the directory or the files cannot be opened!" 
      return x 
+0

Ваш 'f.close()' находится в неправильном месте. – Rishav

+0

Эй, спасибо, за какой вариант? Первый или второй? Это неправильно? Или просто просто не в том месте? – Ruckol1

+0

Я работаю над этим. Момент. – Rishav

ответ

2

От https://docs.python.org/2/library/os.html#os.walk:

os.walk(top, topdown=True, onerror=None, followlinks=False)

Generate the file names in a directory tree by walking the tree either top-down or bottom-up. For each directory in the tree rooted at directory top (including top itself), it yields a 3-tuple (dirpath, dirnames, filenames) .

dirpath is a string, the path to the directory. dirnames is a list of the names of the subdirectories in dirpath (excluding '.' and '..'). filenames is a list of the names of the non-directory files in dirpath . Note that the names in the lists contain no path components. To get a full path (which begins with top) to a file or directory in dirpath , do os.path.join(dirpath, name) .


Кроме того, f.close() должен быть вне for line in lines, в противном случае вы называете его несколько раз, и второй раз, когда вы ее называете, f уже закрыт, и его даст ошибку ввода-вывода.


Вы должны избегать явно open() ИНГ и close() ИНГ файлы, такие как:

f=open(filename, 'w') 
f.write(newline) 
f.close() 

и вместо того, чтобы использовать context managers (т.е. with заявление):

with open(filename, 'w'): 
    f.write(newline) 

, который делает то же самое но неявно закрывает файл, когда тело with завершено.

+0

Эй, я просто хотел спросить, есть ли проблемы с прямыми' paths + filename'? – Rishav

+0

Кроме того, я бы предложил посмотреть ['с открытым (имя файла) как f'] (https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects) – albert

+0

@ РишавКунду: напр. 'dirpath' - это что-то вроде'/a/b/c'', а 'filename' -' 'f'', с' dirpath + filename' вы получаете ''/a/b/cf'' – fferri

-2

Вот код, который делает то, что вы спросили:

import os 

def rootdir(x): 
    for paths, dirs, files in os.walk(x): 
     for filename in files: 
      try: 
       f=open(os.path.join(dirpath, name), 'w') 
       f.write('new content here') 
       f.close() 
      except Exception, e: 
       print "Could not open " + filename 

rootdir("/Users/xrisk/Desktop") 

Однако, у меня есть чувство, вы не совсем понять, что здесь происходит (без обид). Сначала ознакомьтесь с документацией os.walk, предоставленной компанией @mescalinum. Третий элемент кортежа files будет содержать только имя файла. Вам нужно объединить его с paths, чтобы получить полный путь к файлу.

Кроме того, вам не нужно сначала читать файл, чтобы написать ему.С другой стороны, если вы хотите добавить в файл, вы должны использовать режим «а» при открытии файла

В общем, при чтении/записи файла, вы только закрыть его после отделки все чтение/запись. В противном случае вы получите исключение.

Thanks @mescalinum