Re: Request for a change in the csv module.

2007-03-13 Thread Diez B. Roggisch
Paulo da Silva schrieb:
 [EMAIL PROTECTED] escreveu:
 On Mar 12, 4:26 pm, Paulo da Silva [EMAIL PROTECTED] wrote:
 ...
 
 locale.setlocale(locale.LC_NUMERIC, 'pt_BR.ISO8859-1')
 csv_writer = csv.writer(open(foo.csv,w), dialect='excel')
 rows = (('testing', 1.23), ('testing', 2.34))
 formatted_rows = ((string, locale.format('%g', number)) for
 (string,number) in rows)
 csv_writer.writerows(formatted_rows)
 
 
 That works but it is a pain to use.

Why? I think it's straightforward.

 May be I'll sublass csv or even I'll write one myself.
 It would be much better to be able to specify an additional
 variabel to the Dialect class and change csv.

I don't think so. The csv module is about the subtleties that can occur 
when parsing textual data with possible escape chars and the like, and 
creating that data.

But IHMO its up to the user to feed it with just textual data. Because 
automatically converting numbers falls flat on it's face in case of 
special requirements like a limit on the number of digits to render and 
the like. Better do that in a simple and straightforward preprocessing 
state, as shown above.

The same is essentially true for dates as well, btw. How do you want to 
deal with them?

Diez
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Request for a change in the csv module.

2007-03-13 Thread Szabolcs Nagy

 It would be much better to be able to specify an additional
 variabel to the Dialect class and change csv.

no it wouldn't
this is a locale specific problem so it should be handled there

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Request for a change in the csv module.

2007-03-13 Thread Paulo da Silva
Diez B. Roggisch escreveu:
 Paulo da Silva schrieb:
...

 That works but it is a pain to use.
 
 Why? I think it's straightforward.

That is not the point. The problem is to have things generalized.
I have some general purpose tables whose fields format I don't know
in advance.
Internally the numeric values are independent of localization.
Having a table, I don't like the idea of preformating things
before sending them to the csv for exportation. A little more
of programming and there will be no need for csv at all :-)
...
 The same is essentially true for dates as well, btw. How do you want to
 deal with them?

This is a pertinent question I didn't think of. May be csv should handle
data conversions using 'locale'.
It is already automatically converting numbers to text
anyway, but unconditionally using the '.'.
As for the dates the dialect could include a format like -MM-DD
hh:mm:ss. Dates are not always 'locale' only. In pt_PT we use
-MM-DD or YY-MM-DD and sometimes DD-MM-.
One must remember that csv is not part of the language. So, to have
some kind of universality, it must use the specs (in dialect) for
formatting and 'locale' for data conversions.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Request for a change in the csv module.

2007-03-13 Thread Diez B. Roggisch
Paulo da Silva wrote:

 Diez B. Roggisch escreveu:
 Paulo da Silva schrieb:
 ...
 
 That works but it is a pain to use.
 
 Why? I think it's straightforward.
 
 That is not the point. The problem is to have things generalized.
 I have some general purpose tables whose fields format I don't know
 in advance.
 Internally the numeric values are independent of localization.
 Having a table, I don't like the idea of preformating things
 before sending them to the csv for exportation. A little more
 of programming and there will be no need for csv at all :-)
 ...

This is simply _not_ true. The details of a proper CSV format are difficult
to get right, which is precisely why the module is there.

 The same is essentially true for dates as well, btw. How do you want to
 deal with them?
 
 This is a pertinent question I didn't think of. May be csv should handle
 data conversions using 'locale'.
 It is already automatically converting numbers to text
 anyway, but unconditionally using the '.'.
 As for the dates the dialect could include a format like -MM-DD
 hh:mm:ss. Dates are not always 'locale' only. In pt_PT we use
 -MM-DD or YY-MM-DD and sometimes DD-MM-.
 One must remember that csv is not part of the language. So, to have
 some kind of universality, it must use the specs (in dialect) for
 formatting and 'locale' for data conversions.

I'm not too convinced. It's so darn easy to convert the values to what one
really needs for the actual use-case. Even for your generic case - all you
need is type-based formatting dispatch.

But if you add that complexity to the writers of the csv-module, you'll end
up with a nasty configuration mechanism for special casing individual
columns, or otherwise the next user comes and says well, I need to format
dates differently just for this case, how to do so in the csv-module. As
your own example shows. 

The purpose of the module is solely to assist in creating properly formatted
csv content in the sense that it is readable and parsable and results in
strings for column values. Not more, not less (and you seem to
underestimate that task, btw.)

That it does convert non-string-values to strings when writing could be seen
as convenience, or actual bug as it might cause troubles as you perceived
them - but the solution would clearly be to get rid of this functionality,
not enhance it.

Diez
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Request for a change in the csv module.

2007-03-13 Thread skip

Paulo That is not the point. The problem is to have things generalized.

Well, perhaps.  One of the goals of the csv module was to do things the way
Excel does things.  Ideally, that would include formatting elements with
locale sensitivity.  I've been working on a csv module in Python, so I
decided to try the locale.format() calls in its writerow implementation.  A
number of test cases broke as a result because apparently locale.format
doesn't do its job quite the same way Excel does.  I don't think pushing the
locale-sensitive formatting down into the csv module is going to be a
panacea.

Skip
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Request for a change in the csv module.

2007-03-13 Thread Paulo da Silva
Diez B. Roggisch escreveu:
 Paulo da Silva wrote:
...

 
 That it does convert non-string-values to strings when writing could be seen
 as convenience, or actual bug as it might cause troubles as you perceived
 them - but the solution would clearly be to get rid of this functionality,
 not enhance it.


It's just a matter of
personal opinion, and IMO, taking in consideration what other python
modules provide, a csv module should make the appropriate data
conversions. It is simple to implement for most (all?) cases and it will
bring a lot of functionality. You just output things.
In csv output you don't need special data formats. Only the data to the
most available precision. Dates are a very special case, as are the
separators, line terminators, etc.

The python way of exporting this data should be something like:
class MyDialect(Dialect):
...
locale=[EMAIL PROTECTED]
dateformat=-MM-DD hh:mm:ss

...
w=csv.writer(f,dialect=MyDialect)
w.writerows(foo)

Frequent tasks should be done by the modules. Not by the users.
And csv is unusable without output formatting. This is particulary true
if, as you said, the csv didn't provide any conversion at all.
So, why force the programmers to repeat the same tedious procedures
whenever they want to use csv, not to talk about the lack of performance
that implies?
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Request for a change in the csv module.

2007-03-13 Thread Paulo da Silva
[EMAIL PROTECTED] escreveu:
 Paulo That is not the point. The problem is to have things generalized.
 
 Well, perhaps.  One of the goals of the csv module was to do things the way
 Excel does things.

It would be nice because many csv users use it to export files to
spreadsheets and Excel is certainly a reference. But there may be a
difference! One thing is to do things as Excel does and another is
to write data in a way Excel understands. The later, IMO, is not so
complicated.

  Ideally, that would include formatting elements with
 locale sensitivity.  I've been working on a csv module in Python, so I
 decided to try the locale.format() calls in its writerow implementation.  A
 number of test cases broke as a result because apparently locale.format
 doesn't do its job quite the same way Excel does.
locale.format does not need to write the same way Excel does. It just
should convert in a way Excel understands.
Anyway, a csv user needs to do that if it is not provided by csv.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Request for a change in the csv module.

2007-03-12 Thread attn . steven . kuo
On Mar 12, 4:26 pm, Paulo da Silva [EMAIL PROTECTED] wrote:
 Hi.

 I have just seen that csv module, more exactly the Dialect class,
 does not have any variable to specify the floating point character!
 In portuguese this is ','. Not '.'. 3.1415 - 3,1415.
 I think this is also the case of other languages/countries.
 If I am correct, i.e. if there is no such possibility, where can
 I file a request for a csv change? Excel, for example, automatically
 converts '.' to ',' and the separator from ',' to ';'.




Try using locale.format when writing:

import csv
import locale

locale.setlocale(locale.LC_NUMERIC, 'pt_BR.ISO8859-1')
csv_writer = csv.writer(open(foo.csv,w), dialect='excel')
rows = (('testing', 1.23), ('testing', 2.34))
formatted_rows = ((string, locale.format('%g', number)) for
(string,number) in rows)
csv_writer.writerows(formatted_rows)


locale.atof and locale.atoi can convert a string back
to a number.

--
Hope this helps,
Steven


-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Request for a change in the csv module.

2007-03-12 Thread Paulo da Silva
[EMAIL PROTECTED] escreveu:
 On Mar 12, 4:26 pm, Paulo da Silva [EMAIL PROTECTED] wrote:
...

 
 locale.setlocale(locale.LC_NUMERIC, 'pt_BR.ISO8859-1')
 csv_writer = csv.writer(open(foo.csv,w), dialect='excel')
 rows = (('testing', 1.23), ('testing', 2.34))
 formatted_rows = ((string, locale.format('%g', number)) for
 (string,number) in rows)
 csv_writer.writerows(formatted_rows)


That works but it is a pain to use.
May be I'll sublass csv or even I'll write one myself.
It would be much better to be able to specify an additional
variabel to the Dialect class and change csv.

Thanks
Paulo
-- 
http://mail.python.org/mailman/listinfo/python-list