2012-05-25 4 views
0

В настоящее время я программирую игру, которая требует чтения и записи строк в текстовом файле. Мне было интересно, есть ли способ прочитать определенную строку в текстовом файле (т. Е. Первая строка в текстовом файле). Кроме того, есть ли способ написать строку в определенном месте (т. Е. Изменить первую строку в файле, записать пару других строк, а затем снова изменить первую строку)? Я знаю, что мы можем читать строки последовательно по телефону:Чтение строк в текстовых файлах с использованием python

f.readline() 

Edit: На основе ответов, по-видимому, нет никакого способа, чтобы прочитать конкретные строки, если они имеют разную длину. Я работаю только над небольшой частью проекта большой группы, и изменить способ хранения данных будет означать большую работу.

Но есть ли способ изменить конкретно первую строку файла? Я знаю вызов:

f.write('text') 

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

+5

Короткий ответ: Нет, если вы не знаете длины всех линий. Это не зависит от используемого языка программирования - как еще вы узнаете, к какой строке вы подключаетесь, если не считаете новые строки? –

+0

Как я могу изменить первую строку файла. Насколько мне известно, вызов file.write ('line') записывает строку в конце файла? – user1246462

ответ

1

Если все ваши линии гарантированно имеют одинаковую длину, вы можете использовать f.seek(N) для позиционирования указателя файла на N'-байте (где N - LINESIZE * line_number), а затем f.read(LINESIZE). В противном случае я не знаю, как это сделать в обычном ASCII-файле (о чем я думаю, о чем вы спрашиваете).

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

Если ваш текстовый файл не очень большой, вы всегда можете хранить каждую строку в списке:

with open('textfile','r') as f: 
    lines=[L[:-1] for L in f.readlines()] 

(обратите внимание, я снял с новой строки, так что вам не нужно помнить, чтобы держать его вокруг)

Затем вы можете управлять списком путем добавления записей, удаление записей, изменения записей и т.д. в конце концов, вы можете написать список обратно в текстовый файл:

with open('textfile','w') as f: 
    f.write('\n'.join(lines)) 

Вот небольшой тест, который работает для меня на OS-X, чтобы заменить только первую строку.

test.dat

this line has n characters 
this line also has n characters 

test.py

#First, I get the length of the first line -- if you already know it, skip this block 
f=open('test.dat','r') 
l=f.readline() 
linelen=len(l)-1 
f.close() 

#apparently mode='a+' doesn't work on all systems :(so I use 'r+' instead 
f=open('test.dat','r+') 
f.seek(0) 
f.write('a'*linelen+'\n') #'a'*linelen = 'aaaaaaaaa...' 
f.close() 
+0

Есть ли способ прочитать файл и добавить к нему в одно и то же время? Я в настоящее время добавляю что-то в файл, но это не позволяет мне прочитать файл в одно и то же время. – user1246462

+1

Я думаю, что 'open ('filename', 'a +')' должно позволить вам читать/писать из файла. Обратите внимание, что сразу после открытия указатель файла будет в конце файла, поэтому для того, чтобы действительно что-то прочитать, вам нужно будет «f.seek (0)», чтобы вернуться к началу. (вы можете сохранить конечную точку с помощью 'f.tell()'), чтобы вы могли вернуться к концу в любое время, хотя вы ... – mgilson

+0

'\ n'.join (lines) <-' \ n 'нечетно Вот. readlines() вернет список строк с новыми строками строк, т. е. с \ n. – stalk

0

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

У вас обязательно есть чтение/запись случайных мест в файле во время выполнения?Я думаю, вам следует рассмотреть возможность изменения всего подхода:

Если данные малы, вы можете хранить/изменять/генерировать данные во время выполнения в памяти в соответствующих форматах контейнера (например, список или dict), а затем записывать их полностью (при изменении или только при выходе из программы). Вы могли бы рассмотреть возможность поиска простых баз данных. Кроме того, есть хорошие форматы обмена данными, такие как JSON, который был бы идеальным форматом, если ваши данные будут храниться в словаре во время выполнения.

Пример, чтобы сделать концепцию более понятной. Рассмотрим у вас уже есть данные, записанные в gamedata.dat:

[{"playtime": 25, "score": 13, "name": "rudolf"}, {"playtime": 300, "score": 1, "name": "peter"}] 

Это UTF-8 кодировке и JSON-отформатированные данные. Чтение файла во время выполнения вашей игры Python:

with open("gamedata.dat") as f: 
    s = f.read().decode("utf-8") 

Преобразование данных в типы Python:

gamedata = json.loads(s) 

Изменить данные (добавить нового пользователя):

user = {"name": "john", "score": 1337, "playtime": 1} 
gamedata.append(user) 

Джон действительно является игроком 1337 года. Однако на этом этапе вы также могли бы удалить пользователя, изменить оценку Рудольфа или изменить имя Петра ... В любом случае после изменения вы можете просто записать новые данные обратно на диск:

with open("gamedata.dat", "w") as f: 
    f.write(json.dumps(gamedata).encode("utf-8")) 

Дело в том, что вы управляете (создаете/изменяете/удаляете) данные во время выполнения в соответствующих типах контейнеров. При записи данных на диск вы записываете весь набор данных, чтобы сохранить текущее состояние игры.

+0

Да, файл будет позже прочитан в другой программе, так что мне не будет другого способа написать файл. – user1246462

+0

Вот почему вы должны «написать его полностью сразу (при изменении или только когда ваша программа выходит») в какой-то момент времени после того, как вы выполнили манипуляции с данными, например, в словаре :) –

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