Hoe een bestand lezen zonder nieuwe regels?

In Python, aanroepen

temp = open(filename,'r').readlines()

resulteert in een lijst waarin elk element een regel in het bestand is. Het is een beetje dom, maar toch: readlines()schrijft ook newline-tekens naar elk element, iets wat ik niet wil dat er gebeurt.

Hoe kan ik het vermijden?


Antwoord 1, autoriteit 100%

Je kunt het hele bestand lezen en regels splitsen met str.splitlines:

temp = file.read().splitlines()

Of je kunt de nieuwe regel met de hand strippen:

temp = [line[:-1] for line in file]

Opmerking:deze laatste oplossing werkt alleen als het bestand eindigt met een nieuwe regel, anders verliest de laatste regel een teken.

Deze veronderstelling is in de meeste gevallen waar (vooral voor bestanden die zijn gemaakt door teksteditors, die vaak tocheen eindigende nieuwe regel toevoegen).

Als je dit wilt vermijden, kun je een nieuwe regel toevoegen aan het einde van het bestand:

with open(the_file, 'r+') as f:
    f.seek(-1, 2)  # go at the end of the file
    if f.read(1) != '\n':
        # add missing newline if not already present
        f.write('\n')
        f.flush()
        f.seek(0)
    lines = [line[:-1] for line in f]

Of een eenvoudiger alternatief is om in plaats daarvan de nieuwe regel te strip:

[line.rstrip('\n') for line in file]

Of zelfs, hoewel behoorlijk onleesbaar:

[line[:-(line[-1] == '\n') or len(line)+1] for line in file]

Hiermee wordt misbruik gemaakt van het feit dat de retourwaarde van orgeen boolean is, maar het object dat als waar of onwaar is beoordeeld.


De readlinesmethode is eigenlijk gelijk aan:

def readlines(self):
    lines = []
    for line in iter(self.readline, ''):
        lines.append(line)
    return lines
# or equivalently
def readlines(self):
    lines = []
    while True:
        line = self.readline()
        if not line:
            break
        lines.append(line)
    return lines

Sinds readline()de nieuwe regel bewaart, behoudt readlines()deze ook.

Opmerking:voor symmetrie naar readlines()de writelines()methode voegt geennieuwe regels toe, dus f2.writelines(f.readlines())produceert een exacte kopie van fin f2.


Antwoord 2, autoriteit 8%

temp = open(filename,'r').read().split('\n')

Antwoord 3, autoriteit 3%

Bestand één rij tegelijk lezen. Verwijder ongewenste tekens aan het einde van de tekenreeks met str.rstrip(chars).

with open(filename, 'r') as fileobj:
    for row in fileobj:
        print(row.rstrip('\n'))

Zie ook str.strip([chars])en str.lstrip([chars]).


Antwoord 4, autoriteit 2%

temp = open(filename,'r').read().splitlines()

Antwoord 5, autoriteit 2%

Ik denk dat dit de beste optie is.

temp = [line.strip() for line in file.readlines()]

Antwoord 6

Probeer dit:

u=open("url.txt","r")  
url=u.read().replace('\n','')  
print(url)  

Antwoord 7

Probeer om de volgende tekens aan het einde van de regel (/n) en lege lijstwaarden ('') te verwijderen:

f = open(path_sample, "r")
lines = [line for line in f.readlines() if line.strip() != '']

Antwoord 8

my_file = open("first_file.txt", "r")
for line in my_file.readlines():
    if line[-1:] == "\n":
        print(line[:-1])
    else:
        print(line)
my_file.close() 

Antwoord 9

import csv
with open(filename) as f:
    csvreader = csv.reader(f)
    for line in csvreader:
         print(line[0])

Antwoord 10

def getText():
    file=open("ex1.txt","r");
    names=file.read().split("\n");
    for x,word in enumerate(names):
        if(len(word)>=20):
            return 0;
            print "length of ",word,"is over 20"
            break;
        if(x==20):
            return 0;
            break;
    else:
        return names;
def show(names):
    for word in names:
        len_set=len(set(word))
        print word," ",len_set
for i in range(1):
    names=getText();
    if(names!=0):
        show(names);
    else:
        break;

Other episodes