How to use csv.Sniffer for 2 different CSV-types?

11,255

Sniffer expects a sample string, not a file. All you should need to do is:

dialect = csv.Sniffer().sniff(csvfile.readline(), [',',';'])
csvfile.seek(0)  
data = csv.reader(csvfile, dialect)

The seek is important, because you are moving your current position in the file with the readline command, and you need to reset back to the beginning of the file. Otherwise you lose data.

Share:
11,255
tdhulster
Author by

tdhulster

Software Arrghtist - Software crafter

Updated on July 28, 2022

Comments

  • tdhulster
    tdhulster over 1 year

    I want to read 2 different types of CSV-files:

    • one with a ',' as delimiter
    • one with a ';' as delimiter

    I tried to check which delimiter I'm using by doing:

    dialect = csv.Sniffer().sniff(csvfile, [',', ';'])  
    data = csv.reader(csvfile, dialect)
    

    but then I get the TypeError : expected string or buffer.

    If I do this, it works, but then I don't know when to use what delimiter.

    data = csv.reader(csvfile, delimiter = ",")  
    data = csv.reader(csvfile, delimiter = ";")
    

    Can someone help me please?

  • Vaidøtas I.
    Vaidøtas I. about 4 years
    What is the point of listing the delimiters when the Sniffer's sole purpose is to determine them without prior knowledge?
  • Quentin
    Quentin about 3 years
    @VaidøtasI. The point is to restrict the delimiter it can found, avoiding weird delimiter detection. On one of my tests, the sniffer found "B" to be my delimiter ..which is clearly not my real csv delimiter.
  • Vaidøtas I.
    Vaidøtas I. about 3 years
    @Quentin, oh ok