私のファイルは次の内容の「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] No such file or directory: 'books.xml\n'
最後の改行だけを削除するには:
line = line.rstrip('\n')
readline
が改行文字を保持する理由は、空の行(改行がある)とファイルの終わり(空の文字列)を区別できるようにするためです。
から Pythonで改行区切りファイルを読み取り、改行を破棄するための最良の方法?
lines = open(filename).read().splitlines()
文字列オブジェクトの.rstrip()
メソッドを使用して、末尾の空白(改行を含む)が削除されたバージョンを取得できます。
例えば。:
find_root(file.rstrip())
好奇心のために時間を計った。以下は、さまざまな大きなファイルの結果です。
tldr;大きなファイルでは、ファイルを読み取ってから分割するのが最速の方法のようです。
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's 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's 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
大きなファイルでは、ファイルを読み取ってから分割するのが最速の方法のようです。
注:read then split( "\ n")の場合、リストの最後に空の文字列が追加されます。
注:読み込んでからsplitlines()を実行すると、「\ n」だけでなく「\ r\n」もチェックされます。
最後から改行文字を削除するには、次のようなものを使用することもできます。
for line in file:
print line[:-1]
@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"
ファイルにコンテキストマネージャを使用し、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
# mode : 'r', 'w', 'a'
f = open("ur_filename", "mode")
for t in f:
if(t):
fn.write(t.rstrip("\n"))
「if」条件は、行に文字列があるかどうかをチェックし、yesの場合、次の行は最後にある「\ n」を取り除き、ファイルに書き込みます。コードテスト済み。 ;)