This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2011年05月25日 18:27 by ebreck, last changed 2022年04月11日 14:57 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| pybug.zip | ebreck, 2011年05月25日 18:27 | |||
| 0eb420ce6567.diff | catalin.iacob, 2011年07月06日 21:21 | review | ||
| Pull Requests | |||
|---|---|---|---|
| URL | Status | Linked | Edit |
| PR 13710 | merged | berker.peksag, 2019年05月31日 20:57 | |
| Repositories containing patches | |||
|---|---|---|---|
| http://bitbucket.org/cataliniacob/cpython#issue12178 | |||
| Messages (13) | |||
|---|---|---|---|
| msg136881 - (view) | Author: Eric Breck (ebreck) | Date: 2011年05月25日 18:27 | |
Consider the attached two files. A reader and writer with the same dialect parameters (escapechar \ quotechar " doublequote False) read, then write a CSV cell that looks like "C\\". It's written "C\". The problem is, when doublequote=False, the escapechar isn't used to escape itself, and the writer writes something that in the same dialect would be understood differently (\" isn't \ then end of string, it's an escaped quotechar within the string). Execute python err.py first.csv to see. |
|||
| msg136973 - (view) | Author: Éric Araujo (eric.araujo) * (Python committer) | Date: 2011年05月26日 14:59 | |
Thanks for the report. It would be best if you could attach files as plain text instead of archives. |
|||
| msg139953 - (view) | Author: Catalin Iacob (catalin.iacob) * | Date: 2011年07月06日 21:20 | |
I looked at this and tried to provide a patch + tests. Please review. The bug is that a writer can use writerow on some input data but if a reader with the same dialect reads them back they are different from the input ones. This happens when the input data contains escapechar. Contrary to msg136881, this happens regardless whether doublequote is True or False. The docs say "On reading, the escapechar removes any special meaning from the following character". Therefore, I understand that on writing, escapechar must always be escaped by itself. If that doesn't happen, when reading it back, escapechar alters the thing that follows it instead of counting as escapechar which is precisely what this bug is about. |
|||
| msg140002 - (view) | Author: Éric Araujo (eric.araujo) * (Python committer) | Date: 2011年07月07日 23:31 | |
Thanks for the patch. The tests look good at first glance. I can’t comment on the C code, I don’t know C. Hopefully someone will do it, otherwise if you don’t get feedback in say four weeks you can ask for a review on python-dev. |
|||
| msg273746 - (view) | Author: Wayne Harris (Apathymannequin) | Date: 2016年08月27日 02:11 | |
Hi, I can confirm that this behavior still exists in my current python versions (3.5.2 & 2.7.11). I'm happy to take a look at the code, but considering I made this account specifically to comment on this issue I assume someone else will want to, as well. If you want to make sure this is still broken, just use any of the docs' reader and writer examples, adding a trailing escape char to the end. |
|||
| msg273784 - (view) | Author: Skip Montanaro (skip.montanaro) * (Python triager) | Date: 2016年08月27日 16:18 | |
The patch looked okay to me, and when applied to the 2.7 source, the new tests pass muster. I'm not going to pretend I know where this patch should be applied. That's for someone else to pronounce. |
|||
| msg309815 - (view) | Author: Sebastian Bank (xflr6) | Date: 2018年01月11日 16:27 | |
Hi, is there something we can do to get this going? As the issue breaks round-trip, it currently requires work-arounds like this: https://github.com/cldf/csvw/blob/1324550266c821ef32d1e79c124191e93aefbfa8/csvw/dsv.py#L67-L71 |
|||
| msg349720 - (view) | Author: Brad MacGregor (avatarofhope) | Date: 2019年08月14日 17:35 | |
I needed this patch for a project, so I compiled python with the patch applied, and tested my specific use case, and it worked. Thanks for the patch! |
|||
| msg352447 - (view) | Author: Tal Einat (taleinat) * (Python committer) | Date: 2019年09月14日 19:01 | |
FWIW, though this is arguably fixing a bug, IMO this shouldn't be back-ported to 2.7 or 3.7, but only be in 3.8+, to avoid breaking backwards-compatibility. That being said, it would be great to get this into 3.8.0! |
|||
| msg355118 - (view) | Author: Aldrian Obaja (Aldrian Obaja) | Date: 2019年10月22日 06:09 | |
I think this issue needs to be escalated, as this is clearly a bug that makes it troublesome to use csv.reader and csv.writer with escapechar. |
|||
| msg377206 - (view) | Author: Tal Einat (taleinat) * (Python committer) | Date: 2020年09月20日 06:38 | |
New changeset 5c0eed7375fdd791cc5e19ceabfab4170ad44062 by Berker Peksag in branch 'master': bpo-12178: Fix escaping of escapechar in csv.writer() (GH-13710) https://github.com/python/cpython/commit/5c0eed7375fdd791cc5e19ceabfab4170ad44062 |
|||
| msg377207 - (view) | Author: Tal Einat (taleinat) * (Python committer) | Date: 2020年09月20日 06:40 | |
After a great deal of delay, a fix for this has finally been merged, and will be available in Python 3.10. Thanks to everyone involved! |
|||
| msg397440 - (view) | Author: Sebastian Bank (xflr6) | Date: 2021年07月13日 19:26 | |
Thanks Tal.
AFAICT there was an undocumented change in behaviour related to this fix.
Python 3.9 quotes values with escapechar:
```
import csv
import io
kwargs = {'escapechar': '\\'}
value = 'spam\\eggs'
print(value)
with io.StringIO() as buf:
writer = csv.writer(buf, **kwargs)
writer.writerow([value])
line = buf.getvalue()
print(line.strip())
with io.StringIO(line) as buf:
reader = csv.reader(buf, **kwargs)
(new_value,), = reader
print(new_value)
spam\eggs
"spam\eggs"
spameggs
```
- quotes escapechar
- fails to double the escapechar (this bug)
Btw, from
https://docs.python.org/3/library/csv.html#csv.QUOTE_MINIMAL
> only quote those fields which contain special characters
> such as delimiter, quotechar or any of the characters in lineterminator.
this seems incorrect because escapechar is not mentioned (but at the same time it says 'such as') and maybe better matching the name 'minimal' (or one might expect 'more' quoting as a better default).
Python 3.10:
https://github.com/python/cpython/blob/5c0eed7375fdd791cc5e19ceabfab4170ad44062/Lib/test/test_csv.py#L207-L208
See also https://github.com/xflr6/csv23/actions/runs/1027687524
|
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:57:17 | admin | set | github: 56387 |
| 2021年07月13日 19:26:06 | xflr6 | set | messages: + msg397440 |
| 2020年09月20日 06:40:59 | taleinat | set | status: open -> closed versions: + Python 3.10, - Python 2.7, Python 3.8, Python 3.9 messages: + msg377207 resolution: fixed stage: patch review -> resolved |
| 2020年09月20日 06:38:14 | taleinat | set | messages: + msg377206 |
| 2019年10月22日 06:12:05 | larry | set | nosy:
- larry |
| 2019年10月22日 06:11:30 | larry | set | versions: + Python 3.8, Python 3.9, - Python 3.5, Python 3.6 |
| 2019年10月22日 06:09:22 | Aldrian Obaja | set | nosy:
+ Aldrian Obaja messages: + msg355118 |
| 2019年09月14日 19:01:26 | taleinat | set | nosy:
+ taleinat messages: + msg352447 |
| 2019年08月14日 17:35:07 | avatarofhope | set | nosy:
+ avatarofhope messages: + msg349720 |
| 2019年06月02日 18:19:01 | Jeffrey.Kintscher | set | nosy:
- Jeffrey.Kintscher |
| 2019年05月31日 20:57:08 | berker.peksag | set | pull_requests: + pull_request13597 |
| 2019年05月31日 08:45:22 | Jeffrey.Kintscher | set | nosy:
+ Jeffrey.Kintscher |
| 2019年05月09日 09:10:10 | Alex Shpilkin | set | nosy:
+ Alex Shpilkin |
| 2018年01月11日 16:27:51 | xflr6 | set | nosy:
+ xflr6 messages: + msg309815 |
| 2017年12月27日 12:12:40 | Dmitriy Shashkin | set | nosy:
+ Dmitriy Shashkin |
| 2016年08月27日 16:45:23 | berker.peksag | set | nosy:
+ berker.peksag versions: + Python 3.5, Python 3.6, - Python 3.2, Python 3.3 |
| 2016年08月27日 16:18:51 | skip.montanaro | set | nosy:
- skip.montanaro |
| 2016年08月27日 16:18:33 | skip.montanaro | set | messages: + msg273784 |
| 2016年08月27日 02:11:08 | Apathymannequin | set | nosy:
+ Apathymannequin messages: + msg273746 |
| 2012年07月07日 08:40:10 | catalin.iacob | set | nosy:
+ larry |
| 2011年07月07日 23:31:42 | eric.araujo | set | keywords:
+ needs review stage: patch review messages: + msg140002 versions: - Python 3.1 |
| 2011年07月06日 21:21:25 | catalin.iacob | set | files:
+ 0eb420ce6567.diff keywords: + patch |
| 2011年07月06日 21:20:31 | catalin.iacob | set | nosy:
+ catalin.iacob messages: + msg139953 hgrepos: + hgrepo38 |
| 2011年05月26日 14:59:20 | eric.araujo | set | versions:
+ Python 3.1, Python 3.2, Python 3.3, - Python 2.6 nosy: + eric.araujo, skip.montanaro messages: + msg136973 components: + Extension Modules, - None |
| 2011年05月25日 18:27:10 | ebreck | create | |