sim_rum
sim_rum

Reputation: 51

How to format txt file in Python

I am trying to convert a txt file into a csv file in Python. The current format of the txt file are several strings separated by spaces. I would like to write each string into one cell in the csv file.

The txt file has got following structure:

UserID Desktop Display (Version) (Server/Port handle), Date

UserID Desktop Display (Version) (Server/Port handle), Date

etc.

My approach would be following:

with open('licfile.txt', "r+") as in_file:
    stripped = (line.strip() for line in in_file)
    lines = (line.split(" ") for line in stripped if line)

with open('licfile.csv', 'w') as out_file:
    writer = csv.writer(out_file)
    writer.writerow(('user', 'desktop', 'display', 'version', 'server', 'handle', 'date'))
    writer.writerows(lines)

Unfortunately this is not working as expected. I do get following ValueError: I/O operation on closed file. Additionally only the intended row headers are shown in one cell in the csv file.

Any tips on how to proceed? Many thanks in advance.

Upvotes: 3

Views: 2891

Answers (4)

r.ook
r.ook

Reputation: 13898

You can also use the built in csv module to accomplish this easily:

import csv

with open('licfile.txt', 'r') as in_file, open('licfile.csv', 'w') as out_file:
    reader = csv.reader(in_file, delimiter=" ")  
    writer = csv.writer(out_file, lineterminator='\n')
    writer.writerows(reader)

I used lineterminator='\n' argument here as the default is \r\n and it ends up giving you an extra line of return per row in most cases.

There are also a few arguments you could use if say quoting is needed or a different delimiter is desired: https://docs.python.org/3/library/csv.html#csv-fmt-params

Upvotes: 1

SpghttCd
SpghttCd

Reputation: 10890

how about

with open('licfile.txt', 'r') as in_file, open('licfile.csv', 'w') as out_file:
    for line in in_file:
        if line.strip():
            out_file.write(line.strip().replace(' ', ',') + '\n')

and for the german Excel enthusiasts...

...
    ...
        ...
            ... .replace(' ', ';') + '\n')

:)

Upvotes: 3

Amit Nanaware
Amit Nanaware

Reputation: 3356

You are using comprehension with round brackets which will cause to create tuple object. Instead of that just use square bracket which will return list. see below example:

stripped = [line.strip() for line in in_file]
lines = [line.split(" ") for line in stripped if line]

Upvotes: 1

Akshay Salvi
Akshay Salvi

Reputation: 197

licfile_df = pd.read_csv('licfile.txt',sep=",", header=None)

Upvotes: 0

Related Questions