2016-05-07 3 views
1

У меня books.txt файл, который содержит названия книг, авторов и цены следующим образом:Как обновить существующий текстовый файл в Python?

The Hunger Games,Suzanne Collins,12.97 
The Fault In Our Stars,John Green,11.76 
The Notebook,Nicholas Sparks,11.39 

Я отсортирован его в список списков, чтобы получить это:

[[The Hunger Games, Suzanne Collins, 12.97], [The Fault In Our Stars, John Green, 11.76], [The Notebook, Nicholas Sparks, 11.39]] 

код, который я использовал является:

def booksDatabase(): 
     for line in infile: 
      line = line.rstrip().split(",") 
      line[2] = float(line[2]) 
      table.append(line) 


infile = open("books.txt") 

table = [] 

booksDatabase() 

infile.close() 

И я хотел бы, чтобы обновить файл .txt так, что он содержит текущий список списков. Как мне это сделать без импорта каких-либо библиотек?

Заранее спасибо.

Update: Я попытался сделать это:

def booksDatabase(): 
     for line in infile: 
      line = line.rstrip().split(",") 
      line[2] = float(line[2]) 
      table.append(line) 
      outfile.write(line) 

infile = open("books.txt") 
outfile = open("books.txt", 'w') 

table = [] 

booksDatabase() 

infile.close() 

Но я получил эту ошибку:

outfile.write(line) 
TypeError: write() argument must be str, not list 

Что я делаю неправильно?

+0

Вы пытались открыть файл в режиме записи/добавления вместо режима чтения? –

+0

Нет, не знаю. Не могли бы вы объяснить, что вы имеете в виду? Я новичок в Python. – Raux

+0

Предложите вам прочитать следующее: https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files – cdarke

ответ

1

Если вы просто хотите, чтобы отсортировать строки в файле, нет необходимости разбивать строки или лишить их. Это только сделало бы необходимым присоединиться к ним и добавить правильный разделитель строк позже.

Так что попробуйте это;

with open('books.txt') as books: 
    lines = books.readlines() 
lines.sort() 
with open('books.txt', 'w') as sortedbooks: 
    sortedbooks.writelines(lines) 
+0

Хотя это очень простой вопрос/anwser только слово предупреждения: эта настройка не является атомарной, то есть, если books.txt изменяется другим процессом между строк чтения и записи, вы потеряете данные (см. https://stackoverflow.com/questions/2333872/atomic-writing-to-file-with-python)! –

+0

@OliverZendel Вы правы, но, учитывая случай использования, я не думаю, что это проблема. И если операционная система не поддерживает (строгую, а не консультативную) блокировку, у вас никогда не может быть * гарантии *, что файл не будет перезаписан. –

+0

Правильно, это беспорядок. Тем не менее, многие платформы позволяют блокировать файлы. Для всех, кто интересуется этой темой, см .: https://stackoverflow.com/questions/489861/locking-a-file-in-python –

0

попробовать это:

In [354]: l 
Out[354]: 
[['The Hunger Games', 'Suzanne Collins', '12.97'], 
['The Fault In Our Stars', 'John Green', '11.76'], 
['The Notebook', 'Nicholas Sparks', '11.39']] 

with open('d:/temp/a.txt', 'w') as f: 
    f.write('\n'.join([','.join(line) for line in l])) 
+0

(хотя это работает, файл может оставаться открытым до выхода интерпретатора; файлы всегда должны быть явно закрыты в python, предпочтительно с использованием синтаксиса 'with') – spectras

+0

@spectras, спасибо за исправление! Я обновил свой ответ соответственно – MaxU

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