Содержимое файла python исчезает после прочтения? [Дубликат]

Здесь я рассматриваю несколько случаев, через которые вы можете очистить концепцию

1. ArrayList<String> arr = new ArrayList<String>();
2. ArrayList<String> arr = new ArrayList();
3. ArrayList arr = new ArrayList<String>();

Случай 1

ArrayList<String> arr является ссылочной переменной ArrayList с типом String, которые ссылаются на объект ArralyList типа String. Это означает, что он может содержать только объект типа String.

Строго для String не для Raw Type, поэтому он никогда не будет предупреждать.

    arr.add("hello");// alone statement will compile successfully and no warning.

    arr.add(23);  //prone to compile time error.
     //error: no suitable method found for add(int)

Случай 2

В этом случае ArrayList<String> arr является строгим типом, но ваш объект new ArrayList(); является сырым типом.

    arr.add("hello"); //alone this compile but raise the warning.
    arr.add(23);  //again prone to compile time error.
    //error: no suitable method found for add(int)

здесь arr является строгим типом. Таким образом, он будет поднимать ошибку времени компиляции при добавлении integer.

Предупреждение: - Объект типа Raw ссылается на тип Strict Referenced Variable ArrayList.

Случай 3

В этом случае ArrayList arr является сырым типом, но ваш Object new ArrayList<String>(); является строгим типом.

    arr.add("hello");  
    arr.add(23);  //compiles fine but raise the warning.

Он добавит в него любой тип объекта, потому что arr является сырым типом.

Внимание: - A Strict Тип Объект ссылается на a raw тип, на который ссылается переменная.

43
задан Tshepang 27 February 2014 в 08:18
поделиться

4 ответа

Да, это нормальное поведение. Вы в основном читаете в конце файла в первый раз (вы можете сортировать его как чтение ленты), поэтому вы не можете читать больше, если вы не сбросите его, либо используя f.seek(0), чтобы переместить на начало файла или закрыть его, а затем снова открыть его, который начнется с начала файла.

Если вы предпочитаете, вместо этого вы можете использовать синтаксис with, который автоматически закроет файл для вы

, например,

with open('baby1990.html', 'rU') as f:
  for line in f:
     print line

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

66
ответ дан Levon 21 August 2018 в 04:38
поделиться

Поскольку файл-файл читает файл, он использует указатель, чтобы отслеживать, где он находится. Если вы прочитаете часть файла, а затем вернитесь к нему позже, он поднимется туда, где вы остановились. Если вы прочитаете весь файл и вернетесь к тому же файловому объекту, это будет похоже на чтение пустого файла, потому что указатель находится в конце файла, и читать его нечего. Вы можете использовать file.tell(), чтобы увидеть, где в файле указатель, и file.seek установить указатель. Например:

>>> file = open('myfile.txt')
>>> file.tell()
0
>>> file.readline()
'one\n'
>>> file.tell()
4L
>>> file.readline()
'2\n'
>>> file.tell()
6L
>>> file.seek(4)
>>> file.readline()
'2\n'

Кроме того, вы должны знать, что file.readlines() читает весь файл и сохраняет его как список. Это полезно знать, потому что вы можете заменить:

for line in file.readlines():
    #do stuff
file.seek(0)
for line in file.readlines():
    #do more stuff

на:

lines = file.readlines()
for each_line in lines:
    #do stuff
for each_line in lines:
    #do more stuff

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

for line in file:
    #do stuff
13
ответ дан Bi Rico 21 August 2018 в 04:38
поделиться

Конечно. Это нормальное и нормальное поведение. Вместо закрытия и повторного открытия вы можете rewind сохранить файл.

1
ответ дан ch3ka 21 August 2018 в 04:38
поделиться
  • 1
    Это не полезно для пользователя, который не знаком с понятием read-pointer – scubbo 20 December 2017 в 01:54

Файловый объект является буфером . Когда вы читаете из буфера, потребляемая вами часть (позиция чтения сдвигается вперед). Когда вы читаете весь файл, позиция чтения находится в EOF, поэтому он ничего не возвращает, потому что читать нечего.

Если вам по какой-то причине необходимо сбросить позицию чтения на файловый объект, вы можете сделать:

f.seek(0)
8
ответ дан Joel Cornett 21 August 2018 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: