#python #string #list #memory #join
#python #строка #Список #память #Присоединиться
Вопрос:
В python я прочитал файл в список, используя file.readlines()
, позже, следуя некоторой логике, я хотел бы собрать его обратно в строку, используя fileString = ''.join(file)
, по какой-то причине, даже без print
функции, она выводит строку fileString на консоль до определенного момента, затем она просто останавливается. Он не запускает остальную часть программы, которая для меня бесполезна.
Почему join делает это, как мне, возможно, предварительно выделить, сколько памяти я хотел бы использовать для своего списка / строки, чтобы он не останавливался. Или какое-либо другое решение тоже.
Спасибо
Комментарии:
1. извините,
readlines()
используется. создает список. Здесь я просто использую общие имена, но я не использую системные имена в своем реальном коде2. Вы также не должны использовать системные имена в коде примера — это может направить людей по ложному пути относительно того, где кроется ошибка.
3. Я не понимаю вашего вопроса: «после некоторой логики …» почему вы все еще имеете дело с исходным файловым дескриптором
file
? Разве вы не прочитали в содержимом какую-нибудь переменную (str
илиlist
) и почему бы вам не начать оттуда? Если этоlist
, то нет смыслаjoin
просматривать весь список, если вы хотите остановиться «в определенной точке». Вы должны использовать цикл для повторения вашего списка до тех пор, пока вы не захотите, чтобы он остановился.
Ответ №1:
File — это ваш указатель на файл в памяти. Когда вы пытаетесь присоединиться к нему, у вас фактически нет строки для работы.
Как насчет этого?
with open(file, 'rb') as myfile:
strings = myfile.readlines()
# do your stuff to strings
filestring = ''.join(strings)
Обратите внимание, что strings — это список строк, подобных этому:
[‘моя строка n’, ‘моя другая строка! n’]
И как таковой, большой файл потребует довольно много памяти. Возможно, вам будет удобнее создать мини-фильтр.
Комментарии:
1. На самом деле, если вы еще не прочитали файл, вы можете использовать
''.join(myfile)
; он возвращает строку таким же образом,myfile.read()
как это было бы сделано.2. ложная тревога, именно plistLib вызывает ошибку : (
IOError: [Errno 63] File name too long:
3. Но никогда не используйте это, пожалуйста. «Должен быть один очевидный способ сделать это», и если вам нужно сразу загрузить файл в память, используйте
.read()
🙂4. @Tim Pietzcker Если мне когда-нибудь придется сделать что-то настолько ужасающее, как «эй, ты можешь использовать указатель (пару байт), как если бы это был один гигантский сгусток текста! Но только в этом особом случае » тогда я бы выбросил python и выследил Guido за то, что он испортил мой любимый язык 😉
Ответ №2:
Вам также следует подумать о том, что вы собираетесь делать с результирующей строкой. Если вы просто хотите записать содержимое обратно в файл, нет необходимости сначала соединять части, вы можете использовать file.writelines(strings)
напрямую.
Комментарии:
1. супер! это очень помогло