Find delimiter in txt to convert to csv using Python
csv, python
Solution
You have to use `dialect.delimiter` instead of just `dialect` because what is returned is of type class Dialect and you need its attribute `Dialect.delimiter`
rows=csv.reader(f1, delimiter=dialect.delimiter)
Modified code will be as below
import csv
filename_input = 'filein.txt'
filename_output = 'fileout.csv'
with open(filename_input, 'r') as f1, open(filename_output, 'wb') as f2:
dialect = csv.Sniffer().sniff(f1.read(1024), "\t") #### detect delimiters
f1.seek(0)
print(dialect.delimiter)
rows=csv.reader(f1, delimiter=dialect.delimiter)
writer = csv.writer(f2,delimiter=';')
writer.writerows(rows)
Output:
C:\pyp>python.exe txttocsv.py , C:\pyp>
Also note that from doc:
sniff(sample, delimiters=None)
Analyze the given sample and return a Dialect subclass reflecting the parameters found. If the optional delimiters parameter is given, it is interpreted as a string containing possible valid delimiter characters.
Hence if the delimiter that you want to find in your text file is something like `#` instead of `,` or `;` then you should mention that in `sniff` function as second parameter like this:
dialect = csv.Sniffer().sniff(f1.read(1024), '#')
Update: For reading whole file you will need
dialect = csv.Sniffer().sniff(f1.read())
Problem
I have to convert some txt files to csv (and make some operation during the conversion). I use csv.Sniffer() class to detect wich delimiter is used in the txt This code ``` with open(filename_input, 'r') as f1, open(filename_output, 'wb') as f2: dialect = csv.Sniffer().sniff(f1.read(1024)) #### detect delimiters f1.seek(0) r=csv.reader(f1, delimiter=dialect ) writer = csv.writer(f2,delimiter=';') ``` return: Error: Could not determine delimiter This work ``` with open(filename_input, 'r') as f1, open(filename_output, 'wb') as f2: #dialect = csv.Sniffer().sniff(f1.read(1024)) #### detect delimiters #f1.seek(0) r=csv.reader(f1, delimiter='\t' ) writer = csv.writer(f2,delimiter=';') ``` or ``` with open(filename_input, 'r') as f1, open(filename_output, 'wb') as f2: #dialect = csv.Sniffer().sniff(f1.read(1024)) #### detect delimiters #f1.seek(0) r=csv.reader(f1, dialect="excel-tab") writer = csv.writer(f2,delimiter=';') ``` this is a txt row example (10 records delimited by Tab) ``` 166 14908941 sa_s NOVA i 7.05 DEa 7.17 Ncava - Deo mo 7161 4,97 ``` why csv.Sniffer() class doesn't work? The bug was read only 1024 byte to parse the entire txt(maybe this is not enough to detect the delimiter). Now this code works without no other edit: ``` with open(filename_input, 'r') as f1, open(filename_output, 'wb') as f2: dialect = csv.Sniffer().sniff(f1.read()) #### error with dialect = csv.Sniffer().sniff(f1.read(1024)) f1.seek(0) r=csv.reader(f1, delimiter=dialect ) writer = csv.writer(f2,delimiter=';') ```