Как вы читаете файл в списке в Python?

Я хочу, чтобы пользователь вызывал несколько случайных чисел, которые должны быть сгенерированы и сохранены в файле. Он дал нам эту часть. Часть, которую мы должны сделать, - это открыть этот файл, преобразовать числа в список, затем найти среднее, стандартное отклонение и т.д. Без использования простых встроенных инструментов python.

Я пробовал использовать open, но он дает мне недействительный синтаксис (имя файла, которое я выбрал, было "числом", и оно автоматически сохранялось в "My Documents", поэтому я попробовал open(numbers, 'r') и open(C:\name\MyDocuments\numbers, 'r'), и ни один из них не работал).

Ответ 1

with open('C:/path/numbers.txt') as f:
    lines = f.read().splitlines()

это даст вам список значений (строк), которые у вас были в вашем файле, с линией перевода строк.

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

Ответ 2

Два способа чтения файла в список в python (обратите внимание, что они не являются либо) -

  • использование with - поддерживается с помощью python 2.5 и выше
  • использование понятий списка

1. использование with

Это питонический способ открытия и чтения файлов.

#Sample 1 - elucidating each step but not memory efficient
lines = []
with open("C:\name\MyDocuments\numbers") as file:
    for line in file: 
        line = line.strip() #or some other preprocessing
        lines.append(line) #storing everything in memory!

#Sample 2 - a more pythonic and idiomatic way but still not memory efficient
with open("C:\name\MyDocuments\numbers") as file:
    lines = [line.strip() for line in file]

#Sample 3 - a more pythonic way with efficient memory usage. Proper usage of with and file iterators. 
with open("C:\name\MyDocuments\numbers") as file:
    for line in file:
        line = line.strip() #preprocess line
        doSomethingWithThisLine(line) #take action on line instead of storing in a list. more memory efficient at the cost of execution speed.

.strip() используется для каждой строки файла для удаления символа \n новой строки, который может иметь каждая строка. Когда конец with завершается, файл будет автоматически закрыт для вас. Это верно, даже если в нем возникает исключение.

2. использование понимания списка

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

data = [line.strip() for line in open("C:/name/MyDocuments/numbers", 'r')]

Обратите внимание, что закрытие файла зависит от реализации. Обычно неиспользуемыми переменными являются мусор, собранный интерпретатором python. В cPython (версия обычного интерпретатора от python.org) это произойдет немедленно, так как сборщик мусора работает по подсчету ссылок. В другом интерпретаторе, таком как Jython или Iron Python, может быть задержка.

Ответ 3

f = open("file.txt")
lines = f.readlines()

Посмотрите здесь. readlines() возвращает список, содержащий одну строку на элемент. Обратите внимание, что эти строки содержат символ \n (символ новой строки) в конце строки. Вы можете удалить этот символ новой строки с помощью метода strip(). То есть вызовите lines[index].strip(), чтобы получить строку без символа новой строки.

Как отметил joaquin, не забудьте f.close() файл.

Преобразование strint в целые числа легко: int("12").

Ответ 4

Питонический способ прочитать файл и поместить все строки в список:

from __future__ import with_statement #for python 2.5
with open('C:/path/numbers.txt', 'r') as f:
    lines = f.readlines()

Тогда, считая, что каждая строка содержит число,

numbers =[int(e.strip()) for e in lines]

Ответ 5

Вам нужно передать строку имени файла в open. Там дополнительное осложнение, когда строка имеет \ в нем, потому что это специальный символ escape строки для Python. Вы можете исправить это, удвоив каждый как \\ или положив r перед строкой следующим образом: r'C:\name\MyDocuments\numbers'.

Изменить: Редактирование вопроса делает его полностью отличным от оригинала, и поскольку ни один из них не был из оригинального плаката, я не уверен, что они были атакованы. Однако он указывает на одну очевидную вещь, которая, возможно, была упущена, и то, как добавить "Мои документы" в имя файла.

В английской версии Windows XP My Documents на самом деле C:\Documents and Settings\name\My Documents. Это означает, что вызов open должен выглядеть так:

open(r"C:\Documents and Settings\name\My Documents\numbers", 'r')

Я предполагаю, что вы используете XP, потому что вы называете его My Documents - он изменился в Vista и Windows 7. Я не знаю, есть ли простой способ автоматически найти это в Python.

Ответ 6

hdl = open("C:/name/MyDocuments/numbers", 'r')
milist = hdl.readlines()
hdl.close()

Ответ 7

Подводя итог немного тому, что говорили люди:

f=open('data.txt', 'w') # will make a new file or erase a file of that name if it is present
f=open('data.txt', 'r') # will open a file as read-only
f=open('data.txt', 'a') # will open a file for appending (appended data goes to the end of the file)

Если вы хотите что-то на месте, похожее на try/catch

with open('data.txt') as f:
    for line in f:
        print line

Я думаю, что код @movieyoda - это, вероятно, то, что вы должны использовать, однако

Ответ 8

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

    #!/usr/bin/env python

    from os.path import dirname

    with open(dirname(__file__) + '/data/path/filename.txt') as input_data:
        input_list= [map(int,num.split()) for num in input_data.readlines()]