Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
634e076b
Commit
634e076b
authored
Jun 29, 2013
by
R David Murray
Browse files
Options
Browse Files
Download
Plain Diff
Merge #18155: Regex-escape delimiter, in case it is a regex special char.
parents
06beaba7
925a3225
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
47 additions
and
6 deletions
+47
-6
Lib/csv.py
Lib/csv.py
+3
-2
Lib/test/test_csv.py
Lib/test/test_csv.py
+39
-3
Misc/NEWS
Misc/NEWS
+5
-1
No files found.
Lib/csv.py
View file @
634e076b
...
...
@@ -264,8 +264,9 @@ class Sniffer:
# if we see an extra quote between delimiters, we've got a
# double quoted format
dq_regexp
=
re
.
compile
(
r"((%(delim)s)|^)\
W*%(quo
te)s[^%(delim)s\n]*%(quote)s[^%(delim)s\n]*%(quote)s\
W*((%(delim)s)|$)
" % \
{'delim':delim, 'quote':quotechar}, re.MULTILINE)
dq_regexp
=
re
.
compile
(
r"((%(delim)s)|^)\
W*%(quo
te)s[^%(delim)s\n]*%(quote)s[^%(delim)s\n]*%(quote)s\
W*((%(delim)s)|$)
" % \
{'delim':re.escape(delim), 'quote':quotechar}, re.MULTILINE)
...
...
Lib/test/test_csv.py
View file @
634e076b
...
...
@@ -805,7 +805,7 @@ Stonecutters Seafood and Chop House, Lemont, IL, 12/19/02, Week Back
'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'
"""
header
=
'''
\
header
1
=
'''
\
"venue","city","state","date","performers"
'''
sample3
=
'''
\
...
...
@@ -824,10 +824,35 @@ Stonecutters Seafood and Chop House, Lemont, IL, 12/19/02, Week Back
sample6
=
"a|b|c
\
r
\
n
d|e|f
\
r
\
n
"
sample7
=
"'a'|'b'|'c'
\
r
\
n
'd'|e|f
\
r
\
n
"
# Issue 18155: Use a delimiter that is a special char to regex:
header2
=
'''
\
"venue"+"city"+"state"+"date"+"performers"
'''
sample8
=
"""
\
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
"""
sample9
=
"""
\
'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'
"""
def
test_has_header
(
self
):
sniffer
=
csv
.
Sniffer
()
self
.
assertEqual
(
sniffer
.
has_header
(
self
.
sample1
),
False
)
self
.
assertEqual
(
sniffer
.
has_header
(
self
.
header
+
self
.
sample1
),
True
)
self
.
assertEqual
(
sniffer
.
has_header
(
self
.
header1
+
self
.
sample1
),
True
)
def
test_has_header_regex_special_delimiter
(
self
):
sniffer
=
csv
.
Sniffer
()
self
.
assertEqual
(
sniffer
.
has_header
(
self
.
sample8
),
False
)
self
.
assertEqual
(
sniffer
.
has_header
(
self
.
header2
+
self
.
sample8
),
True
)
def
test_sniff
(
self
):
sniffer
=
csv
.
Sniffer
()
...
...
@@ -861,13 +886,24 @@ Stonecutters Seafood and Chop House, Lemont, IL, 12/19/02, Week Back
dialect
=
sniffer
.
sniff
(
self
.
sample7
)
self
.
assertEqual
(
dialect
.
delimiter
,
"|"
)
self
.
assertEqual
(
dialect
.
quotechar
,
"'"
)
dialect
=
sniffer
.
sniff
(
self
.
sample8
)
self
.
assertEqual
(
dialect
.
delimiter
,
'+'
)
dialect
=
sniffer
.
sniff
(
self
.
sample9
)
self
.
assertEqual
(
dialect
.
delimiter
,
'+'
)
self
.
assertEqual
(
dialect
.
quotechar
,
"'"
)
def
test_doublequote
(
self
):
sniffer
=
csv
.
Sniffer
()
dialect
=
sniffer
.
sniff
(
self
.
header
)
dialect
=
sniffer
.
sniff
(
self
.
header1
)
self
.
assertFalse
(
dialect
.
doublequote
)
dialect
=
sniffer
.
sniff
(
self
.
header2
)
self
.
assertFalse
(
dialect
.
doublequote
)
dialect
=
sniffer
.
sniff
(
self
.
sample2
)
self
.
assertTrue
(
dialect
.
doublequote
)
dialect
=
sniffer
.
sniff
(
self
.
sample8
)
self
.
assertFalse
(
dialect
.
doublequote
)
dialect
=
sniffer
.
sniff
(
self
.
sample9
)
self
.
assertTrue
(
dialect
.
doublequote
)
if
not
hasattr
(
sys
,
"gettotalrefcount"
):
if
support
.
verbose
:
print
(
"*** skipping leakage tests ***"
)
...
...
Misc/NEWS
View file @
634e076b
...
...
@@ -135,6 +135,10 @@ Core and Builtins
Library
-------
-
Issue
#
18155
:
The
csv
module
now
correctly
handles
csv
files
that
use
a
delimter
character
that
has
a
special
meaning
in
regexes
,
instead
of
throwing
an
exception
.
-
Issue
#
14360
:
encode_quopri
can
now
be
successfully
used
as
an
encoder
when
constructing
a
MIMEApplication
object
.
...
...
@@ -156,7 +160,7 @@ Library
lists
all
loaded
CA
certificates
and
cert_store_stats
()
returns
amount
of
loaded
X
.509
certs
,
X
.509
CA
certs
and
CRLs
.
-
Issue
#
18167
:
cgi
.
FieldStorage
no
more
fails
to
handle
multipart
/
form
-
data
-
Issue
#
18167
:
cgi
.
FieldStorage
no
longer
fails
to
handle
multipart
/
form
-
data
when
\
r
\
n
appears
at
end
of
65535
bytes
without
other
newlines
.
-
Issue
#
18076
:
Introduce
importlib
.
util
.
decode_source
().
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment