Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > comparing dialects of csv-module

Reply
Thread Tools

comparing dialects of csv-module

 
 
Malte Dik
Guest
Posts: n/a
 
      12-19-2009
Hi out there!

I want to put some intelligence into a csv reading script and in order to do
so I want to compare possible different dialects I collect with some random

d = csv.Sniffer().sniff("1,2,3,4"),

because the csv is kinda dirty.

Now sniff() returns a class object and those aren't comparable in the "if
dialect_1 == dialect_2: count something" sense.

Has anyone around here already dealt with this kind of problem and maybe
even a solution I could utilize? That would be great.

If not - I guess I would just write a quick function comparing the
attributes of those dialects ... - but just out of educational curiosity:
Would it be the right way to implement an __eq__(...) function into the
Dialect class or how would someone who would want to make it right do it?


Sincerest greetings,

Malte
 
Reply With Quote
 
 
 
 
Peter Otten
Guest
Posts: n/a
 
      12-19-2009
Malte Dik wrote:

> Hi out there!
>
> I want to put some intelligence into a csv reading script and in order to
> do so I want to compare possible different dialects I collect with some
> random
>
> d = csv.Sniffer().sniff("1,2,3,4"),
>
> because the csv is kinda dirty.
>
> Now sniff() returns a class object and those aren't comparable in the "if
> dialect_1 == dialect_2: count something" sense.
>
> Has anyone around here already dealt with this kind of problem and maybe
> even a solution I could utilize? That would be great.


An implementation for the lazy

>>> import csv
>>> d = csv.Sniffer().sniff("1,2,3")
>>> def eq(a, b, attributes=[name for name in dir(d) if not

name.startswith("_")]):
.... return all(getattr(a, n, None) == getattr(b, n, None) for n in
attributes)
....
>>> eq(d, csv.Sniffer().sniff("3,4,5"))

True
>>> eq(d, csv.Sniffer().sniff("'3','4','5'"))

False
>>> eq(d, csv.Sniffer().sniff("3;4;5"))

False
>>> eq(d, csv.Sniffer().sniff("3,4,' 5'"))

True


> If not - I guess I would just write a quick function comparing the
> attributes of those dialects ... - but just out of educational curiosity:
> Would it be the right way to implement an __eq__(...) function into the
> Dialect class or how would someone who would want to make it right do it?


I don't know if you can do it for classic classes; for newstyle classes
you'd have to reimplement comparison in the metaclass:

>>> class Dialect:

.... class __metaclass__(type):
.... def __eq__(self, other):
.... return self._key() == other._key()
.... def __ne__(self, other):
.... return self._key() != other._key()
.... def _key(self):
.... return self.quotechar, self.delimiter #,...
....
>>> class A(Dialect):

.... quotechar = "'"
.... delimiter = ":"
....
>>> class B(Dialect):

.... quotechar = "'"
.... delimiter = ","
....
>>> A == B

False
>>> B.delimiter = ":"
>>> A == B

True

On a side note, I think it's a C++ism that dialects are classes rather than
class instances. That's a superfluous complication since in Python no work
will be moved from compile time to runtime anyway.

Peter
 
Reply With Quote
 
 
 
 
Malte Dik
Guest
Posts: n/a
 
      12-19-2009
quote:
> An implementation for the lazy
>
>>>> import csv
>>>> d = csv.Sniffer().sniff("1,2,3")
>>>> def eq(a, b, attributes=[name for name in dir(d) if not

> name.startswith("_")]):
> ... return all(getattr(a, n, None) == getattr(b, n, None) for n in
> attributes)
> ...


Wow, this is awesome. I'd never come up with something like this.


Will digg into it deeper as I implement it (code snippets like this need to
melt in order to effuse all their flavor , but want to thank you very much
in the first place!



Have a nice day everyone,

Malte
 
Reply With Quote
 
Malte Dik
Guest
Posts: n/a
 
      12-20-2009
quote:
>>>> d = csv.Sniffer().sniff("1,2,3")
>>>> def eq(a, b, attributes=[name for name in dir(d) if not

> name.startswith("_")]):
> ... return all(getattr(a, n, None) == getattr(b, n, None) for n in
> attributes)


Only change I made is substituting "dir(csv.excel)" or "dir(csv.Dialect)"
for "dir(d)", because I can't be always sure, that there'd be a nicely
defined "d".


Salute,

Malte
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
comparing the array in parallel srinukasam VHDL 3 07-30-2005 12:27 PM
comparing the array for generic parameters srinukasam VHDL 3 06-30-2005 07:40 PM
comparing the contents of memory srinukasam VHDL 5 06-23-2005 07:49 PM
[VHDL] Comparing entity and component declarations M.D. van de Burgwal VHDL 3 10-07-2004 08:58 AM
Comparing values in 2 textfiles and returning the missing values Jorgen Gustafsson Perl 4 12-12-2003 09:09 AM



Advertisments