Search code examples
pythonexcelcsvexport-to-csv

CSV writer adds the first line to the last cell


I am trying to write to a csv file that has been saved with another program (excel and others). However when I open the file to write to it, the first line written is added to last cell of the last line.

file.csv
['1','2','3']
['1','2','3']
import csv   
fields=['A','B','C']
with open('file.csv', 'a', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(fields)

Expected results:

['1','2','3']
['1','2','3']
['A','B','C'] 

Actual results:

['1','2','3']
['1','2','3A','B','C']

If I just write to file then write to it again without viewing it, there's no issue, but if I open the file, and save it inside the program the next line written is added to the previous line instead of becoming it's own line.

I assume there is a formatting issue with how the program saves the file, but I am at a loss as to how to fix it.


Solution

  • Lines in CSV files should always be terminated with a "\r\n" sequence, even if its the last line in the file. In the grand tradition of CSV programming, this is often ignored. The fix is to write a program that peeks at the file and fixes it as needed before use. And write a bug against the "other" program that wrote the nonconforming CSV in the first place.

    import csv
    
    def csv_delimiter_fixer(filename):
        with open(filename, 'a+b') as fileobj:
            fileobj.seek(-1, 2)
            if fileobj.read(1) != b"\n":
                fileobj.write(b"\r\n")
    
    fields=['A','B','C']
    filename = 'file.csv'
    csv_delimiter_fixer(filename)
    with open('file.csv', 'a', newline='') as f:
        writer = csv.writer(f)
        writer.writerow(fields)