Подтвердить что ты не робот

Читать строку из файла в python без добавления "\n" в конце

Мой файл "xml.txt" со следующим содержимым:

books.xml 
news.xml
mix.xml

если я использую функцию readline(), она добавляет "\n" в имя всех файлов, которые являются ошибкой, потому что я хочу открыть файлы, содержащиеся в xml.txt. Я написал это:

fo = open("xml.tx","r")
for i in range(count.__len__()): #here count is one of may arrays that i'm using
    file = fo.readline()
    find_root(file) # here find_root is my own created function not displayed here

Ошибка при запуске этого кода:

IOError: [Errno 2] Нет такого файла или каталога: 'books.xml\n'

4b9b3361

Ответ 1

Чтобы удалить только новую строку в конце:

line = line.rstrip('\n')

Причина readline содержит символ новой строки, поэтому вы можете различать пустую строку (имеет новую строку) и конец файла (пустая строка).

Ответ 2

Вы можете использовать метод .rstrip() для строковых объектов, чтобы удалить версию с завершающим пробелом (включая новые строки).

например:.

find_root(file.rstrip())

Ответ 4

Лучше использовать диспетчер контекста для файла, а len() вместо вызова .__len__()

with open("xml.tx","r") as fo:
    for i in range(len(count)): #here count is one of may arrays that i'm using
        file = next(fo).rstrip("\n")
        find_root(file) # here find_root is my own created function not displayed here

Ответ 5

Чтобы удалить символ новой строки в конце, вы также можете использовать что-то вроде этого:

for line in file:
   print line[:-1]

Ответ 6

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

TL;DR; Чтение файла, а затем разделение, по-видимому, является самым быстрым подходом к большому файлу.

with open(FILENAME, "r") as file:
    lines = file.read().split("\n")

Однако, если вам нужно все-таки прокручивать строки, вы, вероятно, захотите:

with open(FILENAME, "r") as file:
    for line in file:
        line = line.rstrip("\n")

Python 3.4.2

import timeit


FILENAME = "mylargefile.csv"
DELIMITER = "\n"


def splitlines_read():
    """Read the file then split the lines from the splitlines builtin method.

    Returns:
        lines (list): List of file lines.
    """
    with open(FILENAME, "r") as file:
        lines = file.read().splitlines()
    return lines
# end splitlines_read

def split_read():
    """Read the file then split the lines.

    This method will return empty strings for blank lines (Same as the other methods).
    This method may also have an extra additional element as an empty string (compared to
    splitlines_read).

    Returns:
        lines (list): List of file lines.
    """
    with open(FILENAME, "r") as file:
        lines = file.read().split(DELIMITER)
    return lines
# end split_read

def strip_read():
    """Loop through the file and create a new list of lines and removes any "\n" by rstrip

    Returns:
        lines (list): List of file lines.
    """
    with open(FILENAME, "r") as file:
        lines = [line.rstrip(DELIMITER) for line in file]
    return lines
# end strip_readline

def strip_readlines():
    """Loop through the file read lines and create a new list of lines and removes any "\n" by
    rstrip. ... will probably be slower than the strip_read, but might as well test everything.

    Returns:
        lines (list): List of file lines.
    """
    with open(FILENAME, "r") as file:
        lines = [line.rstrip(DELIMITER) for line in file.readlines()]
    return lines
# end strip_readline

def compare_times():
    run = 100
    splitlines_t = timeit.timeit(splitlines_read, number=run)
    print("Splitlines Read:", splitlines_t)

    split_t = timeit.timeit(split_read, number=run)
    print("Split Read:", split_t)

    strip_t = timeit.timeit(strip_read, number=run)
    print("Strip Read:", strip_t)

    striplines_t = timeit.timeit(strip_readlines, number=run)
    print("Strip Readlines:", striplines_t)
# end compare_times

def compare_values():
    """Compare the values of the file.

    Note: split_read fails, because has an extra empty string in the list of lines. That the only
    reason why it fails.
    """
    splr = splitlines_read()
    sprl = split_read()
    strr = strip_read()
    strl = strip_readlines()

    print("splitlines_read")
    print(repr(splr[:10]))

    print("split_read", splr == sprl)
    print(repr(sprl[:10]))

    print("strip_read", splr == strr)
    print(repr(strr[:10]))

    print("strip_readline", splr == strl)
    print(repr(strl[:10]))
# end compare_values

if __name__ == "__main__":
    compare_values()
    compare_times()

Результаты:

run = 1000
Splitlines Read: 201.02846901328783
Split Read: 137.51448011841822
Strip Read: 156.18040391519133
Strip Readline: 172.12281272950372

run = 100
Splitlines Read: 19.956802833188124
Split Read: 13.657361738959867
Strip Read: 15.731161020969516
Strip Readlines: 17.434831199281092

run = 100
Splitlines Read: 20.01516321280158
Split Read: 13.786344555543899
Strip Read: 16.02410587620824
Strip Readlines: 17.09326775703279

Чтение файла, а затем разделение, по-видимому, является самым быстрым подходом к большому файлу.

Примечание: прочитайте, тогда split ( "\n" ) будет иметь дополнительную пустую строку в конце списка.

Примечание: прочитайте затем splitlines(), чтобы проверить больше, чем просто "\n", возможно, "\ r\n".

Ответ 7

Случай использования с ответом @Lars Wirzenius:

with open("list.txt", "r") as myfile:
    for lines in myfile:
        lines = lines.rstrip('\n')    # the trick
        try:
            with open(lines) as myFile:
                print "ok"
        except IOError as e:
            print "files does not exist"

Ответ 8

# mode : 'r', 'w', 'a'
f = open("ur_filename", "mode")
for t in f:
    if(t):
        fn.write(t.rstrip("\n"))

"Если условие будет проверять, имеет ли строка строку или нет, если да, следующая строка разделит" \n "в конце и напишет в файл. Протестировано.;)