<div dir="ltr">I am trying to process a CSV file using Python 3.5 (CPython tip as of a week or so ago). According to chardet[1], the file is encoded as utf-8:<div><br></div><div><div><div>>>> s = open("data/meets-usms.csv", "rb").read()</div><div>>>> len(s)</div><div>562272</div><div>>>> import chardet</div><div>>>> chardet.detect(s)</div><div>{'encoding': 'utf-8', 'confidence': 0.99}</div></div><div><br></div><div>so I created the reader like so:</div><div><br></div><div><div>        rdr = csv.DictReader(open(csvfile, encoding="utf-8"))</div></div><div><br></div><div>This seems to work. The rows are read and records added to a SQLite3 database. When I go into sqlite3, I get what looks to be raw utf-8 on output:</div><div><br></div><div>% LANG=en_US.UTF-8 sqlite3 topten.db</div><div>SQLite version 3.8.5 2014-08-15 22:37:57</div><div>Enter ".help" for usage hints.</div><div>sqlite> select * from swimmeet where meetname like '%Barracuda%';</div><div>sqlite> select count(*) from swimmeet;</div><div>0</div><div>sqlite> select count(*) from swimmeet;</div><div>4171</div><div><div>sqlite> select meetname from swimmeet where meetname like '%Barracuda%Patrick%';</div><div>Anderson Barracudas St. Patrick's Day Swim Meet</div><div>Anderson Barracuda Masters - 2010 St. Patrick’s Day Swim Meet</div><div>Anderson Barracuda Masters 2011 St. Patrick’s Day Swim Meet</div><div>Anderson Barracuda Masters St. Patrick's Day Meet</div><div>Anderson Barracuda Masters St. Patrick's Day Meet 2014</div><div>Anderson Barracuda Masters 2015 St. Patrick’s Day Swim Meet</div></div><div><br></div><div>Note the wacky three bytes where the apostrophe in "St. Patrick's" should be. The data came to me as an XLSX spreadsheet, which I dumped to CSV using LibreOffice. That's how the character was encoded at that point.</div><div><br></div><div>I tweaked my CSV-to-SQLite script to print the meet name and id for those meets with "Barracuda" and "Patrick" in their name:</div><div><br></div><div><div>                if dry_run or verbose:</div><div>                    if ("Barracuda" in row["MeetTitle"] and</div><div>                        "Patrick" in row["MeetTitle"]):</div><div>                        print("Insert", n, row["MeetTitle"], row["MeetID"])</div></div><div><br></div><div>When I run it, I see raw bytes instead of a properly rendered apostrophe:</div><div><br></div><div>% LANG=en_US.utf-8 python3.5 src/usmsmeets2db.py -v data/meets-usms.csv topten.db </div><div>Insert 1173 Anderson Barracudas St. Patrick's Day Swim Meet 20090321ABMSTPY</div><div>Insert 1559 Anderson Barracuda Masters - 2010 St. Patrick’s Day Swim Meet 20100320CUDASY</div><div>Insert 1995 Anderson Barracuda Masters 2011 St. Patrick’s Day Swim Meet 20110319ANDERSY</div><div>Insert 3012 Anderson Barracuda Masters St. Patrick's Day Meet 20130316AndersY</div><div>Insert 3562 Anderson Barracuda Masters St. Patrick's Day Meet 2014 20140315ANDERSY</div><div>Insert 4114 Anderson Barracuda Masters 2015 St. Patrick’s Day Swim Meet 20150321AndersY</div><div>Read 4962 rows, inserted 4171 records</div><div><br></div><div>Why am I not seeing what I believe to be a non-ASCII apostrophe of some sort properly printed? This is running on a Mac (Yosemite) in its Terminal app, with its encoding preference set to utf-8. It appears just as shown above, "a" with a caret, the Euro symbol, then the "TM" symbol. Have I perhaps lost the properly encoded bytes somewhere, and now it's just spewing the bogus bytes (mojibake)?</div><div><br></div><div>Thanks,</div><div><br></div><div>Skip</div><div><br></div><div>--<br></div><div>[1] <a href="https://pypi.python.org/pypi/chardet/2.3.0">https://pypi.python.org/pypi/chardet/2.3.0</a></div></div></div>