[Python-checkins] r75102 - in python/trunk/Lib: csv.py test/test_csv.py

skip.montanaro python-checkins at python.org
Mon Sep 28 04:12:28 CEST 2009


Author: skip.montanaro
Date: Mon Sep 28 04:12:27 2009
New Revision: 75102
Log:
Patch from Thomas Barr so that csv.Sniffer will set doublequote property.
Closes issue 6606.
Modified:
 python/trunk/Lib/csv.py
 python/trunk/Lib/test/test_csv.py
Modified: python/trunk/Lib/csv.py
==============================================================================
--- python/trunk/Lib/csv.py	(original)
+++ python/trunk/Lib/csv.py	Mon Sep 28 04:12:27 2009
@@ -170,7 +170,7 @@
 Returns a dialect (or None) corresponding to the sample
 """
 
- quotechar, delimiter, skipinitialspace = \
+ quotechar, doublequote, delimiter, skipinitialspace = \
 self._guess_quote_and_delimiter(sample, delimiters)
 if not delimiter:
 delimiter, skipinitialspace = self._guess_delimiter(sample,
@@ -184,8 +184,8 @@
 lineterminator = '\r\n'
 quoting = QUOTE_MINIMAL
 # escapechar = ''
- doublequote = False
 
+ dialect.doublequote = doublequote
 dialect.delimiter = delimiter
 # _csv.reader won't accept a quotechar of ''
 dialect.quotechar = quotechar or '"'
@@ -217,8 +217,8 @@
 break
 
 if not matches:
- return ('', None, 0) # (quotechar, delimiter, skipinitialspace)
-
+ # (quotechar, doublequote, delimiter, skipinitialspace)
+ return ('', False, None, 0)
 quotes = {}
 delims = {}
 spaces = 0
@@ -255,7 +255,19 @@
 delim = ''
 skipinitialspace = 0
 
- return (quotechar, delim, skipinitialspace)
+ # if we see an extra quote between delimiters, we've got a
+ # double quoted format
+ dq_regexp = re.compile(r"((%(delim)s)|^)\W*%(quote)s[^%(delim)s\n]*%(quote)s[^%(delim)s\n]*%(quote)s\W*((%(delim)s)|$)" % \
+ {'delim':delim, 'quote':quotechar}, re.MULTILINE)
+
+
+
+ if dq_regexp.search(data):
+ doublequote = True
+ else:
+ doublequote = False
+
+ return (quotechar, doublequote, delim, skipinitialspace)
 
 
 def _guess_delimiter(self, data, delimiters):
Modified: python/trunk/Lib/test/test_csv.py
==============================================================================
--- python/trunk/Lib/test/test_csv.py	(original)
+++ python/trunk/Lib/test/test_csv.py	Mon Sep 28 04:12:27 2009
@@ -891,7 +891,7 @@
 'Harry''s':'Arlington Heights':'IL':'2/1/03':'Kimi Hayes'
 'Shark City':'Glendale Heights':'IL':'12/28/02':'Prezence'
 'Tommy''s Place':'Blue Island':'IL':'12/28/02':'Blue Sunday/White Crow'
-'Stonecutters Seafood and Chop House':'Lemont':'IL':'12/19/02':'Week Back'
+'Stonecutters ''Seafood'' and Chop House':'Lemont':'IL':'12/19/02':'Week Back'
 """
 header = '''\
 "venue","city","state","date","performers"
@@ -950,6 +950,13 @@
 self.assertEqual(dialect.delimiter, "|")
 self.assertEqual(dialect.quotechar, "'")
 
+ def test_doublequote(self):
+ sniffer = csv.Sniffer()
+ dialect = sniffer.sniff(self.header)
+ self.assertFalse(dialect.doublequote)
+ dialect = sniffer.sniff(self.sample2)
+ self.assertTrue(dialect.doublequote)
+
 if not hasattr(sys, "gettotalrefcount"):
 if test_support.verbose: print "*** skipping leakage tests ***"
 else:


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /