ã¯ããã«
ã¨ã¼ã½ãã¼ï¼1 nikkieã§ãã
ããæ°æ¥ã¯csvã¢ã¸ã¥ã¼ã«ã§ç¥ã£ããã¨ãã¢ã¦ãããããã¦ãã¾ãã
ä»åã¯csv.DictReaderã®ã½ã¼ã¹ã³ã¼ããªã¼ãã£ã³ã°ã§ç¥ã£ããã¨ã§ãã
ç®æ¬¡
- ã¯ããã«
- ç®æ¬¡
- csv.DictReaderã¨ã¯
- csv.DictReaderã®ã½ã¼ã¹ã³ã¼ããªã¼ãã£ã³ã°
- ããé§åæ¬ãã ç¶æ¿ããå§è²
- çµããã«
csv.DictReaderã¨ã¯
CSVå½¢å¼ã®ãã¡ã¤ã«ãPythonã§èªã¿æ¸ãããã¨ãã«ä½¿ãã®ããæ¨æºã©ã¤ãã©ãªã®csvã
以ä¸ã®ãããªã³ã¼ãã§èªã¿è¾¼ãã¾ãï¼ãã®è¨äºã®å¯¾è©±ä¾ã¯ Python 3.10.9 ã§ãï¼ã
some.csv
name,price apple,1000 banana,500
>>> import csv >>> with open("some.csv", newline="", encoding="utf8") as f: ... reader = csv.reader(f) ... for row in reader: ... print(row) ... ['name', 'price'] ['apple', '1000'] ['banana', '500']
csv.readerã§ã¯åè¡ããªã¹ãã«ãªãã¾ãã
æ´æ°ã¤ã³ããã¯ã¹ã§ååã®å¤ã«ã¢ã¯ã»ã¹ãã¾ãã
æ´æ°ã¤ã³ããã¯ã¹ã ã¨ãã¸ãã¯ãã³ãã¼ã¿ãããã¾ãããã
csvã¢ã¸ã¥ã¼ã«ã«ã¯csv.DictReaderã¨ããã¯ã©ã¹ãããã¾ãï¼
https://docs.python.org/ja/3/library/csv.html#csv.DictReader
ãã®ã¯ã©ã¹ã使ãã¨ãCSVã®åè¡ãè¾æ¸ã§æ±ãã¾ãã
æ´æ°ã¤ã³ããã¯ã¹ãããããã¼ã®é
ç®åã«å¤ãã2ã®ã§ãååã®å¤ã¸ã®ã¢ã¯ã»ã¹ãããåãããããã¨æãã¾ãï¼
>>> with open("some.csv", newline="", encoding="utf8") as f: ... reader = csv.DictReader(f) ... for row in reader: ... print(row) ... {'name': 'apple', 'price': '1000'} {'name': 'banana', 'price': '500'}
DictReaderã«ãreaderåæ§ãdialect弿°ãããã¾ã3ã
csv.DictReaderã®ã½ã¼ã¹ã³ã¼ããªã¼ãã£ã³ã°
ã½ã¼ã¹ã³ã¼ãã¯ãããªã«é·ãããã¾ãã4ã
https://github.com/python/cpython/blob/v3.11.3/Lib/csv.py#L80-L127
csv.DictReaderã¤ã³ã¹ã¿ã³ã¹ã¯ã¤ãã¬ã¼ã¿
ä¸ã§ç¤ºãã対話ä¾ã§ã¯foræã§ä½¿ç¨ãã¾ããã
foræã§ä½¿ããã®ã§ã¤ãã©ãã«ã§ã
å®è£
ãè¦ãã¨ãç¹æ®ã¡ã½ãã__iter__ã¨__next__ãæã¤ã®ã§ãã¤ãã¬ã¼ã¿ã¨åããã¾ãã
__iter__: https://github.com/python/cpython/blob/v3.11.3/Lib/csv.py#L90-L91- ã¤ã³ã¹ã¿ã³ã¹èªèº«ãè¿ãã¦ãã¾ã
__next__: https://github.com/python/cpython/blob/v3.11.3/Lib/csv.py#L107-L127- CSVãã¡ã¤ã«ã®1è¡1è¡ãè¿ãå¦çã§ãï¼ãã®å¾è¦ã¾ãï¼
class DictReader: # çç¥ def __iter__(self): return self def __next__(self): # çç¥
ã¤ãã¬ã¼ã¿ã¯ã¤ãã©ãã«ã§ã
csv.DictReaderã¯csv.readerã«å§è²ãã¦ãã
ãç¶æ¿ãªã®ããªãã¨æ³åãã¦ãããããå®è£
ãè¦ã¦é©ããããã¾ããã
èªãã§ããã¨ããã®å§è²ããã¾ãã§ãã¦ããã¨æããã§ãï¼
__init__ã§csv.readerã¤ã³ã¹ã¿ã³ã¹ãåæåããreader屿§ã«æã¤- https://github.com/python/cpython/blob/v3.11.3/Lib/csv.py#L86
- åæåæã«ãã¡ã¤ã«ãªãã¸ã§ã¯ããdialectãæ¸¡ãã¦ãã
class DictReader: def __init__(self, f, fieldnames=None, restkey=None, restval=None, dialect="excel", *args, **kwds): # ä¸é¨æç² self._fieldnames = fieldnames # list of keys for the dict self.reader = reader(f, dialect, *args, **kwds) self.line_num = 0
__next__ã®å®è£
ã§ã
class DictReader: def __next__(self): # ä¸é¨æç² row = next(self.reader) d = dict(zip(self.fieldnames, row)) lf = len(self.fieldnames) lr = len(row) if lf < lr: d[self.restkey] = row[lf:] elif lf > lr: for key in self.fieldnames[lr:]: d[key] = self.restval return d
next(self.reader)ã¨csv.readerã«1è¡å¦çããã- https://github.com/python/cpython/blob/v3.11.3/Lib/csv.py#L111
- ãªã®ã§ãããã§åããã®ã¯ãªã¹ãï¼æ´æ°ã¤ã³ããã¯ã¹ã§ã¢ã¯ã»ã¹ããè¡ï¼
csv.readerãå¦çãã1è¡ã¨fieldnamesããè¾æ¸ãä½ã- https://github.com/python/cpython/blob/v3.11.3/Lib/csv.py#L119
fieldnamesãè¾æ¸ã®ãã¼ãcsv.readerãå¦çãã1è¡ãè¾æ¸ã®å¤
fieldnamesã¨1è¡ã®é·ããåããªãå ´åã®å¦ç- ããã¥ã¡ã³ããããåã fieldnames ããå¤ãã®ãã£ã¼ã«ããæã£ã¦ããå ´åãæ®ãã®ãã¼ã¿ã¯ãªã¹ãã«å
¥ãããã¦ã restkey ã«ããæå®ããããã£ã¼ã«ãå (ããã©ã«ãã§ã¯ None) ã§ä¿åããã¾ããã
- https://github.com/python/cpython/blob/v3.11.3/Lib/csv.py#L123
- fieldnamesã®é·ããä¸åã£ãè¡ã®è¦ç´ ãã
restkeyã¨ãããã¼ã«æããã¦ãã - ãªã®ã§ã
len(fieldnames)+1åã®ãã¼ã¨å¤ãæã¤
- ããã¥ã¡ã³ããããéãã©ã³ã¯ã®åã fieldnames ãããå°ãªããã£ã¼ã«ãããæããªãå ´åã䏿ã®å¤ã¯ restval ã®å¤ (ããã©ã«ã㯠None ) ã«ãã£ã¦åãããã¾ããã
- https://github.com/python/cpython/blob/v3.11.3/Lib/csv.py#L125-L126
- è¡ãããfieldnamesãé·ãå ´åã¯ã
restvalãå¤ã¨ãã¦ãã¼ãæããã¦ãã - ãªã®ã§ã
len(fieldnames)åã®ãã¼ã¨å¤ãæã¤ããã«è£ããã
- ããã¥ã¡ã³ããããåã fieldnames ããå¤ãã®ãã£ã¼ã«ããæã£ã¦ããå ´åãæ®ãã®ãã¼ã¿ã¯ãªã¹ãã«å
¥ãããã¦ã restkey ã«ããæå®ããããã£ã¼ã«ãå (ããã©ã«ãã§ã¯ None) ã§ä¿åããã¾ããã
ããã¥ã¡ã³ãã§è¨è¼ãããåããã³ã¼ãã§è¡¨ç¾ããã¦ãã¦ããã¾ãã§ãã¦ãããªãã¨èãå·»ãã¾ãã
fieldnames屿§
https://github.com/python/cpython/blob/v3.11.3/Lib/csv.py#L93-L101
class DictReader: @property def fieldnames(self): if self._fieldnames is None: try: self._fieldnames = next(self.reader) except StopIteration: pass self.line_num = self.reader.line_num return self._fieldnames
@propertyã使ã£ãå®è£ ã§ã- çç¥ãã¾ããããsetterãå®ç¾©ããã¦ãã¾ã
_fieldnames屿§ããã§ã«è¨å®ããã¦ããããããè¿ãã¾ã__init__ã§æ¸¡ãããããã§ã«è¨å®ããã¾ãfieldnames屿§ã«ãã§ã«ã¢ã¯ã»ã¹ããã£ããè¨å®ããã¦ãã¾ã
_fieldnames屿§ãè¨å®ããã¦ããªãï¼å¤ãNoneï¼ã®ã¨ãnext(self.reader)ã§è¿ããè¡ãè¨å®ãã¾ã- 1è¡ç®ã«ã¤ãã¦å¼ã°ããããã«å®è£
ãã¦ãã¾ãï¼å¾è¿°ï¼
- 1è¡ç®ããããã¼è¡ãªãã¯ããããã¼ã
fieldnamesã¨ãªãã¾ãã
- 1è¡ç®ããããã¼è¡ãªãã¯ããããã¼ã
ã1è¡ç®ã«ã¤ãã¦å¼ã°ãããã¨ããç¹ã§ããã__next__ã®ä¸ã«1è¡ãå¦çãã¦ããªãã£ãï¼line_num屿§ã®å¤ã05ã ã£ãï¼ããself.fieldnamesã¨å¼ã³åºãã¦ãã¾ãã
https://github.com/python/cpython/blob/v3.11.3/Lib/csv.py#L108-L110
è¿ã£ã¦ããfieldnamesã使ãããã§ã¯ãªãã_fieldnames屿§ã®è¨å®ãç®çã®å¼ã³åºãã¨çè§£ãã¾ããï¼å¯ä½ç¨ã®ããã«ä½¿ããã ã¨ããã³ã¡ã³ããããã¾ãï¼ã
def __next__(self): if self.line_num == 0: # Used only for its side effect. self.fieldnames row = next(self.reader) # çç¥
ããé§åæ¬ãã ç¶æ¿ããå§è²
8ç« ãå¯çµåãã®ã8.2 å¯çµåã®å種äºä¾ã¨å¯¾å¦æ¹æ³ãã§ãè¯ãæ§é ã«ããããã«ãç¶æ¿ããå§è²ããç´¹ä»ããã¦ããã®ãæãåºãã¾ããï¼8.2.1ï¼ã
csv.readerãç¶æ¿ãã¦csv.DictReaderã¯ã©ã¹ãå®ç¾©ããã®ã§ã¯ãªããcsv.readerã¤ã³ã¹ã¿ã³ã¹ã屿§ã«æã¤csv.DictReaderã¯ã©ã¹ã¯ã__iter__ã¨__next__ã¡ã½ããã§ã¤ãã¬ã¼ã¿ã«ããcsv.readerã¯ã©ã¹ã¨æ¯ãèããæãã- æã£ã¦ããããç§ã¯ç¶æ¿ã«ããå®è£ ãªã®ããªã¨æã£ãããã§ãã
__next__ã®å®è£ ã¯ãcsv.readerãè¿ããè¡ï¼ãªã¹ãï¼ãå¥ã®ãªã¹ãfieldnamesã¨çµåãã¦è¾æ¸ãä½ãã¨ãããã®ã§ãã- å®è£ ã¨ãã¦ãããã ãªã¼ã¨æãã¾ãï¼å§è²ã®ä¸ä¾ãªã®ããªã¨èªèãã¾ããï¼
çµããã«
csv.DictReaderã®ã½ã¼ã¹ã³ã¼ããªã¼ãã£ã³ã°ã§ç¥ã£ããã¨ãã¢ã¦ãããããã¾ããã
csv.DictReaderã¯ã©ã¹ã¯csv.readerã¤ã³ã¹ã¿ã³ã¹ãæã¤ï¼å§è²ï¼- CSVãã¡ã¤ã«ã®1è¡ãè¾æ¸ã¨ãã¦è¿ãã®ã«
csv.readerã®å¦ççµæãå å·¥ãã
- CSVãã¡ã¤ã«ã®1è¡ãè¾æ¸ã¨ãã¦è¿ãã®ã«
fieldnames屿§ãCSVãã¡ã¤ã«ã®1è¡ç®ï¼ãããã¼æ³å®ï¼ãè¨å®ãããããã«__next__ãªã©å·¥å¤«ãã¦ãã
æ¯è¼ççãã¯ã©ã¹ã§ããããå®è£ ã«è¾¼ã¿å ¥ã£ãã¨ããã¯ãªãããã£ã¨èªãã¦ããã¤ãæ°ã¥ããããã¾ããð
csv.readerã¯ã©ã¹ã®ä¸ãè¦ãã¦ã¿ããã¨ããã§ããã_csvã«å®è£
ãããããã§ãPythonå®è£
ã§ã¯ãªãå®è£
ãã©ããã«ããããã ãªããããã®èªèã§ãï¼æ¢ãã¨ããããã§ãããCå®è£
ã ã¨æãã®ã§ããã¾ã¯ã¾ã ç§ã¯èªããªãã§ãããï¼
-
渡辺æããããèªçæ¥ããã§ã¨ããããã¾ãï¼
↩ã¯ããã¿ãªãããç¥ãã§ãï¼ï¼
— æè¤ æ±å¤âµï¸æã¡ããHBDâµï¸ (@Saito_Shuka) 2023å¹´4æ16æ¥
æã渡辺æã¡ããã®èªçæ¥ã§ãï¼ï¼ï¼
仿¥ã¯ãã³ãã¼ã°ãé£ã¹ã¾ãããï¼ï¼ https://t.co/4wJ8pNszAI - è¾æ¸ã®ãã¼åã¯ä¸ãããã¨ãã§ãã¾ããããã¥ã¡ã³ããããfieldnames ãçç¥ãããå ´åããã¡ã¤ã« f ã®æåã®åã®å¤ã fieldnames ã¨ãã¦ä½¿ããã¾ããã↩
- 詳ãã㯠↩
-
ããæ°æ¥ã®csvã¢ã¸ã¥ã¼ã«é¢é£ã®ã¢ã¦ããããã§ã½ã¼ã¹ã³ã¼ãã«å
¥ã浸ã£ãã®ã§ããã
DictReaderã¯ãããªã«é·ãã³ã¼ãã§ãªããã¨ã«æ°ã¥ããã¡ãã£ã¨èªãã§ã¿ã¾ãã↩ -
__init__ã§line_numã0ã«åæåãã¦ãã¾ã↩