2012-05-11 3 views
1

Я пишу сценарий, который имеет два входа:Чтение и запись файлов в Python

  1. файл, содержащий список имен,
  2. другой файл (может быть пустым или непустым)

Цель сценария - взять имена из первого файла, получить доступ к определенному API и получить информацию о каждом имени, а затем записать эту информацию во второй файл. Если второй файл уже содержит информацию, сценарий читает последнюю строку написанного файла, находит эту запись в первом файле и затем начинается с этой записи. Однако я столкнулся с проблемой, когда дело доходит до чтения и записи во второй файл.

Когда я устанавливаю второй тип файла на «r +», а затем выполняю печать на file_two.read(), он отображает содержимое второго файла. Когда я делаю другую печать на самой следующей строке, она показывает файл как пустой. Кроме того, когда я устанавливаю тип файла «a +», он показывает файл как полностью пустой оба раза, хотя я могу четко видеть, что информация в текстовом файле действительно есть. Кто-нибудь знает, что происходит?

Вот фрагмент кода, который обрабатывает запись:

def write_to_file(filename, users): 
    pages = range(0, len(users) - 100, 100) 
    for page in pages: 
     user_names = get_users(users[page: page+100]) 
     lines = [format_user(user) for user in user_names] 
     output_text = '\n'.join(lines) 
     with filename as output_file: 
      output_file.write(output_text.encode('utf-8')) 

и вот сегмент кода, который вызывает вышеприведенную функцию.

file_one = args.file1 
file_two = args.file2 
users = read_names_automatic(file_one) 
write_to_file(file_two, users) 
+0

Is 'с именем файла как output_file:' опечатка? Я думаю, вы имеете в виду 'с открытым (filename, 'a +') как output_file:'. – modocache

+1

файл уже был открыт ранее в скрипте с помощью argparse, этот код просто записывает всю информацию в файл, а затем закрывает файл после его завершения. – user1389884

ответ

3

Когда я установить второй тип файла «г +», а затем сделать отпечатанное на file_two.read(), она показывает содержимое второго файла. Когда я делаю другую печать на самой следующей строке, она показывает файл как пустой.

Да, это ожидаемое поведение. Указатель файла указывает на конец файла в конце file_two.read(), поэтому любая попытка прочитать далее возвращает пустую строку. Например, проверьте следующее:

with open("test.txt") as f: 
    print f.readline() # => prints the first line, sets file pointer to second line 
    print f.read() # => prints everything from the second line on 

Чтобы сбросить указатель файла в начало файла:

with open("test.txt") as f: 
    print f.read() # => prints entire file, sets file pointer to end of file 
    f.seek(0) # => reset file pointer to beginning of file 
    print f.read() # => prints entire file 

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

При open("test.txt", "a+") указатель файла установлен в конец файла, поэтому любая попытка чтения приведет к пустой строке. В самом деле, это то, что позволяет вам добавить к файлу. Если вы file_two.seek(0), а затем file_two.write(), письменный текст будет добавлен в начало file_two.

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