«для строки в файле» возвращает буквы вместо строк (python) - PullRequest
0 голосов
/ 21 сентября 2018

Иногда, когда я использую цикл for для итерации строк файла, я получаю каждую букву отдельно, а не каждую строку.Может кто-нибудь объяснить, почему это так?

1 Ответ

0 голосов
/ 21 сентября 2018

См. iter () и Типы итераторов

for a in something:
    pass 

Если тип something является итерируемым, a примет все значения вашегоповторяем по очереди.То, чем в точности становится a, скрыто внутри реализации __iter__(self): объекта, который вы перебираете (afaik).

  • Если вы итерируете по list, он представляет вам все значения по очереди.
  • Если вы итерируете по dict, он предоставляет вам все dict.keys() по очереди.
  • Если вы выполните итерацию по string, он будет представлять вам каждый символ по очереди.

Генераторы и последовательности также обеспечивают итерацию, см. Понимание генераторов в Python и Типы последовательностей

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

Демоданные:

with open("f.txt","w") as f:
    f.write("""Some Text
Some text after a newline.
More text in a new line.""")

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

with open("f.txt","r") as r:
    for c in r: # returns each single line including \n (thats the way next() of file works
        print (c) # appends another \n due to default end='\n' 
print("-"*30)

Вывод:

Some Text

Some text after a newline.

More text in a new line.
------------------------------

Итерация по file.read ():

with open("f.txt","r") as r:
    t = r.read() # returns a single string of the whole files content
    for c in t:  # you iterate characterwise over a string!
        print (c)
print("-"*30)

Вывод:

S
o
m
e

[... snipped ...]

l
i
n
e
.
------------------------------

Итерация по файлу с использованием readline ():

with open("f.txt","r") as r:
    for c in r.readline(): # returns only the first line as string and iterates over this string
        print (c)          # the other lines are omitted!
print("-"*30)

Вывод:

S
o
m
e

T
e
x
t

------------------------------

Итерация по файлу с использованием readlines ():

with open("f.txt","r") as r:
    for c in r.readlines(): # returns a list of strings
        print (c)  # appends another \n due to default end='\n' 
print("-"*30)

Вывод:

Some Text

Some text after a newline.

More text in a new line.
------------------------------

Итерация по двоичному файлу:

with open("f.bin","wb") as f:
    f.write(b"294827523")
    f.write(b"2927523")
    f.write(b"-27523")
    f.write(b"\n-27523")

with open("f.bin","rb") as r:
    for b in r:
        print (b)

Вывод:

b'2948275232927523-27523\n'
b'-27523'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...