Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Writelines writes lines without newline, Just fills the file

Tags:

python

I have a program that writes a list to a file. The list is a list of pipe delimited lines and the lines should be written to the file like this:

123|GSV|Weather_Mean|hello|joe|43.45 122|GEV|temp_Mean|hello|joe|23.45 124|GSI|Weather_Mean|hello|Mike|47.45 

BUT it wrote them line this ahhhh:

123|GSV|Weather_Mean|hello|joe|43.45122|GEV|temp_Mean|hello|joe|23.45124|GSI|Weather_Mean|hello|Mike|47.45 

This program wrote all the lines into like one line without any line breaks.. This hurts me a lot and I gotta figure-out how to reverse this but anyway, where is my program wrong here? I thought write lines should write lines down the file rather than just write everything to one line..

fr = open(sys.argv[1], 'r') # source file fw = open(sys.argv[2]+"/masked_"+sys.argv[1], 'w') # Target Directory Location  for line in fr:     line = line.strip()     if line == "":         continue     columns = line.strip().split('|')     if columns[0].find("@") > 1:         looking_for = columns[0] # this is what we need to search     else:         looking_for = "[email protected]"     if looking_for in d:         # by default, iterating over a dictionary will return keys             new_line = d[looking_for]+'|'+'|'.join(columns[1:])             line_list.append(new_line)     else:         new_idx = str(len(d)+1)         d[looking_for] = new_idx         kv = open(sys.argv[3], 'a')         kv.write(looking_for+" "+new_idx+'\n')         kv.close()         new_line = d[looking_for]+'|'+'|'.join(columns[1:])         line_list.append(new_line) fw.writelines(line_list) 
like image 567
user836087 Avatar asked Dec 05 '12 18:12

user836087


People also ask

Does Writelines add newline?

Also, the write() method displays the output but does not provide a new line character, whereas the writelines() method displays the output and provides a new line character at the end of the string. It is important to note that writelines() do not automatically insert a new line after each item in the iterable.

How is write () different from Writelines ()?

The difference between Write() and WriteLine() method is based on new line character. Write() method displays the output but do not provide a new line character. WriteLine() method displays the output and also provides a new line character it the end of the string, This would set a new line for the next output.

What is the function of Writelines in Python?

The writelines() method writes the items of a list to the file. Where the texts will be inserted depends on the file mode and stream position. "a" : The texts will be inserted at the current file stream position, default at the end of the file.

Does file write in python with new line?

Append Data to a New Line Using a New Line Character ( \n ) in Python. A new line is represented using a new line character or \n in programming languages such as Python or C++. While appending or adding new data to a file, we can add this character at the end of each line to add new data to a new line.


1 Answers

This is actually a pretty common problem for newcomers to Python—especially since, across the standard library and popular third-party libraries, some reading functions strip out newlines, but almost no writing functions (except the log-related stuff) add them.

So, there's a lot of Python code out there that does things like:

fw.write('\n'.join(line_list) + '\n') 

or

fw.write(line + '\n' for line in line_list) 

Either one is correct, and of course you could even write your own writelinesWithNewlines function that wraps it up…

But you should only do this if you can't avoid it.

It's better if you can create/keep the newlines in the first place—as in Greg Hewgill's suggestions:

line_list.append(new_line + "\n") 

And it's even better if you can work at a higher level than raw lines of text, e.g., by using the csv module in the standard library, as esuaro suggests.

For example, right after defining fw, you might do this:

cw = csv.writer(fw, delimiter='|') 

Then, instead of this:

new_line = d[looking_for]+'|'+'|'.join(columns[1:]) line_list.append(new_line) 

You do this:

row_list.append(d[looking_for] + columns[1:]) 

And at the end, instead of this:

fw.writelines(line_list) 

You do this:

cw.writerows(row_list) 

Finally, your design is "open a file, then build up a list of lines to add to the file, then write them all at once". If you're going to open the file up top, why not just write the lines one by one? Whether you're using simple writes or a csv.writer, it'll make your life simpler, and your code easier to read. (Sometimes there can be simplicity, efficiency, or correctness reasons to write a file all at once—but once you've moved the open all the way to the opposite end of the program from the write, you've pretty much lost any benefits of all-at-once.)

like image 140
abarnert Avatar answered Sep 25 '22 06:09

abarnert