Python: How to write a list of strings on separate

2019-08-09 11:14发布

问题:

EDIT: See bottom of post for the entire code

I am new to this forum and I have an issue that I would be grateful for any help solving.

Situation and goal:
- I have a list of strings. Each string is one word, like this: ['WORD', 'LINKS', 'QUOTE' ...] and so on.
- I would like to write this list of words (strings) on separate lines in a new text file.
- One would think the way to do this would be by appending the '\n' to every item in the list, but when I do that, I get a blank line between every list item. WHY?

Please have a look at this simple function:

def write_new_file(input_list):
    with open('TEKST\\TEKST_ny.txt', mode='wt') as output_file: 
        for linje in input_list:
            output_file.write(linje + '\n')

This produces a file that looks like this:

WORD

LINKS

QUOTE

If I remove the '\n', then the file looks like this:

WORDLINKSQUOTE 

Instead, the file should look like this:

WORD   
LINKS   
QUOTE

I am obviously doing something wrong, but after a lot of experimenting and reading around the web, I can't seem to get it right.

Any help would be deeply appreciated, thank you!

Response to link to thread about write() vs. writelines(): Writelines() doesn't fix this by itself, it produces the same result as write() without the '\n'. Unless I add a newline to every list item before passing it to the writelines(). But then we're back at the first option and the blank lines...

I tried to use one of the answers in the linked thread, using '\n'.join() and then write(), but I still get the blank lines.

It comes down to this: For some reason, I get two newlines for every '\n', no matter how I use it. I am .strip()'ing the list items of newline characters to be sure, and without the nl everything is just one massive block of texts anyway.

On using another editor: I tried open the txt-file in windows notepad and in notepad++. Any reason why these programs wouldn't display it correctly?

EDIT: This is the entire code. Sorry for the Norwegian naming. The purpose of the program is to read and clean up a text file and return the words first as a list and ultimately as a new file with each word on a new line. The text file is a list of Scrabble-words, so it's rather big (9 mb or something). PS: I don't advocate Scrabble-cheating, this is just a programming exercise :)

def renskriv(opprinnelig_ord):
    nytt_ord = ''
    for bokstav in opprinnelig_ord:
        if bokstav.isupper() == True:
            nytt_ord = nytt_ord + bokstav
    return nytt_ord

def skriv_ny_fil(ny_liste):
    with open('NSF\\NSF_ny.txt', 'w') as f: 
        for linje in ny_liste: 
            f.write(linje + '\n')


def behandle_kildefil():
    innfil = open('NSF\\NSF_full.txt', 'r')
    f = innfil.read()
    kildeliste = f.split()
    ny_liste = []
    for item in kildeliste:
        nytt_ord = renskriv(item)
        nytt_ord = nytt_ord.strip('\n')
        ny_liste.append(nytt_ord)
    skriv_ny_fil(ny_liste)
    innfil.close()

def main():
    behandle_kildefil()

if __name__ == '__main__':
    main()

回答1:

You've said in the comments that python is writing two carriage return ('\r') characters for each line feed ('\n') character you write. It's a bit bizaare that python is replacing each line feed with two carriage returns, but this is a feature of opening a file in text mode (normally the translation would be to something more useful). If instead you open your file in binary mode then this translation will not be done and the file should display as you wish in Notepad++. NB. Using binary mode may cause problems if you need characters outside the ASCII range -- ASCII is basically just latin letters (no accents), digits and a few symbols.

For python 2 try:

filename = "somefile.txt"
with open(filename, mode="wb") as outfile:
    outfile.write("first line")
    outfile.write("\n")
    outfile.write("second line")

Python 3 will be a bit more tricky. For each string literal you wish you write you must prepend it with a b (for binary). For each string you don't have immediate access to, or don't wish to change to a binary string, then you must encode it using the encode() method on the string. eg.

filename = "somefile.txt"
with open(filename, mode="wb") as outfile:
    outfile.write(b"first line")
    outfile.write(b"\n")
    some_text = "second line"
    outfile.write(some_text.encode())


回答2:

I think there must be some '\n' among your lines, try to skip empty lines. I suggest you this code.

def write_new_file(input_list):
    with open('TEKST\\TEKST_ny.txt', 'w') as output_file: 
        for linje in input_list:
            if not linje.startswith('\n'):
                output_file.write(linje.strip() + '\n')