Theory
એ અલ્પવિરામ જે split() ને તોડે છે
ગયા પાઠના open() થી સજ્જ થઈને, તમે marks.csv જાતે ઉકેલો છો: line.split(','). સુંદર ચાલે છે... હરોળ 40 સુધી:
104,"Patel, Riya",78
નામમાં અલ્પવિરામ છે. તમારું split() ત્રણને બદલે ચાર ટુકડા બનાવે છે, અને score નું ખાનું હવે " Riya" ધરાવે છે.
અવતરણચિહ્નવાળાં ખાનાં, અંદરના અલ્પવિરામ, ભટકેલાં newlines: CSV ના સ્વરૂપને ધારની બાબતો છે, અને હાથે બનાવેલા parsers એ બધા પર મરે છે. Python નું csv module એટલા માટે છે કે તમે ફરી ક્યારેય split(',') ન લખો.
Theory
કોષ્ટકના ટપાલ માટે તાલીમ પામેલો ટપાલી
split() થી CSV વાંચવું એટલે કવર પકડીને દરેક અલ્પવિરામે ફાડવાં, પત્રની અંદરના અલ્પવિરામ પર પણ.
csv નું module એ તાલીમ પામેલો ટપાલી છે: csv.reader દરેક કવર બરાબર ખોલે છે (અવતરણચિહ્નનું માન રાખીને) અને સામગ્રી સુઘડ list તરીકે આપે છે. csv.writer એ જ ટપાલી છે જે તમારી lists ને પાછી માન્ય કવરમાં સીલ કરે છે. Dict ની જોડી આગળ જાય છે: સ્થાનને બદલે ખાનાના નામથી લેબલ થયેલાં કવર.
Theory
reader અને writer, ઔપચારિક રીતે
બંને પહેલેથી ખુલ્લી file ને વીંટાળે છે:
વાંચવું: csv.reader(f) દરેક હરોળ strings ની list તરીકે આપે છે: ['101', 'DBMS', '78']. નોંધો: દરેક મૂલ્ય string છે, સંખ્યાઓ પણ: ગણિત પહેલાં int()/float() થી ફેરવો. Header ની લીટી સામાન્ય પહેલી હરોળ તરીકે આવે છે: next(reader) થી એને કૂદો.
લખવું: csv.writer(f) એ writerow(એક_list) અને writerows(lists ની list) આપે છે.
સ્વરૂપનો એક ખાસ નિયમ: csv માટે files ને `newline=''` સાથે ખોલો, નહીં તો Windows ના વપરાશકારોને દરેક હરોળ પછી ખાલી લીટી મળે છે.
Practical
marks.csv પર ચાર કામદારો
import csv
# READER: rows as lists (strings!)
with open('marks.csv', 'r', newline='') as f:
reader = csv.reader(f)
header = next(reader) # skip the header row
for row in reader:
print(row[0], int(row[2])) # roll, score as a NUMBER
# WRITER: lists back to disk
with open('toppers.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['roll', 'subject', 'score']) # one row
writer.writerows([[101, 'DBMS', 88], [103, 'DBMS', 91]]) # many
# DICTREADER: rows as dictionaries, keys from the header
with open('marks.csv', newline='') as f:
for row in csv.DictReader(f):
print(row['roll'], row['score']) # by NAME, not position
# DICTWRITER: dictionaries to disk (fieldnames required)
with open('report.csv', 'w', newline='') as f:
w = csv.DictWriter(f, fieldnames=['roll', 'score'])
w.writeheader() # do not forget this line
w.writerows([{'roll': 101, 'score': 88}])
This example runs in Gri-Learn on the web, where you can edit it and see the output.
At a glance
csv નું module એક નજરમાં
| કામદાર | હરોળ કેવી દેખાય છે | યાદ રાખો |
|---|---|---|
| csv.reader | ['101', 'DBMS', '78'] (list) | બધું strings; next() header કૂદે છે |
| csv.writer | writerow / writerows | File ને newline='' સાથે ખોલો |
| csv.DictReader | {'roll': '101', 'score': '78'} | Header એ ચાવીઓ બને છે |
| csv.DictWriter | dicts અંદર, fieldnames જોઈએ | પહેલાં writeheader() બોલાવો |
Think first
ગણિત કેમ ભાંગી પડ્યું?
એક student કુલ ગણે છે: for row in csv.reader(f): total = total + row[2]. Python એ TypeError: unsupported operand type(s) આપે છે. CSV સાવ માન્ય છે. Tap કરતાં પહેલાં: row[2] ખરેખર શું છે, અને એક શબ્દનો ઉકેલ શું છે?
Show the answer
row[2] એ string '78' છે, સંખ્યા 78 નહીં: csv.reader દરેક ખાનું લખાણ તરીકે આપે છે, કારણ કે CSV ની files કોઈ પ્રકારની માહિતી વહન કરતી નથી. String ને સંખ્યામાં ઉમેરવું એ જ TypeError છે.
ઉકેલ: int(row[2]) (કે દશાંશ માટે float). ગણિત પહેલાં ફેરવવાની આ ટેવ એ જ પાઠ છે જે એકમ 2 માં SQLite ના .import એ શીખવ્યો હતો: લખાણનાં સ્વરૂપ લખાણ આપે છે; સંખ્યાઓ તમારી જવાબદારી છે.
Quiz
DictReader સાદા reader કરતાં સ્પષ્ટપણે ક્યારે વધુ સારું છે?
- જ્યારે CSV ના ખાનાંનો ક્રમ બદલાઈ શકે: row['score'] હજી ચાલે છે, row[2] ચૂપચાપ તૂટે છે
- જ્યારે file બહુ મોટી હોય: DictReader વધુ ઝડપી છે
- જ્યારે મૂલ્યો strings ને બદલે સંખ્યા તરીકે આવવાં જોઈએ
- જ્યારે file માં header ની હરોળ ન હોય
Show the answer
જ્યારે CSV ના ખાનાંનો ક્રમ બદલાઈ શકે: row['score'] હજી ચાલે છે, row[2] ચૂપચાપ તૂટે છે
DictReader દરેક હરોળને header નાં નામ થી ચાવી આપે છે, એટલે ફરી ગોઠવાયેલી કે વિસ્તરેલી CSV (અધ્યાપકે ખાનું ઉમેર્યું) માં row['score'] સાચું રહે છે જ્યારે સ્થાન આધારિત row[2] કોઈ ભૂલ વગર ખોટું ખાનું વાંચવા લાગે છે: સૌથી ખરાબ પ્રકારનો bug. એ વધુ ઝડપી નથી (વિકલ્પ B), મૂલ્યો હજી strings છે (વિકલ્પ C), અને header ની હરોળ ન હોય ત્યાં DictReader બરાબર ખોટું ઓજાર છે (વિકલ્પ D): એ પહેલી data ની હરોળને ચાવીઓ તરીકે ખાઈ જાત.
Watch out
csv module ની ત્રણ લપસણ
લખતી વખતે newline='' ભૂલવું: હરોળ વચ્ચે ખાલી લીટીઓ (જાણીતું Windows નું લક્ષણ, અને પરીક્ષાનું પ્રિય "આ code માં શું ખોટું છે").
DictWriter સાથે writeheader() છોડી દેવું: header વગરની file જે આગળના દરેક DictReader ને તોડે છે.
સાદા reader સાથે header ની હરોળને data તરીકે ગણવી: 'roll' પર int() નિષ્ફળ જાય છે: પહેલાં next(reader) થી એને કૂદો.
Theory
એક સ્વરૂપ, હવે ત્રણ ઓજાર
તમારી પાસે હવે ત્રણ CSV નાં ઓજાર છે: sqlite3 ના shell નું .import/નિકાસ (એકમ 2), Python નું csv module (હરોળે હરોળ નિયંત્રણ, આ પાઠ), અને આગલા પાઠનું pandas નું read_csv (આખી file એક પદાર્થ તરીકે, એક લીટીમાં). એમની વચ્ચે પસંદગી કરવી એ ખરેખરો engineering નો નિર્ણય છે: એક વખતના loads માટે shell, વહેતા હરોળના logic માટે csv module, વિશ્લેષણ માટે pandas. પરીક્ષાઓને Python માં CSV વાંચવાની બે રીત પૂછવાનું ગમે છે: તમારી પાસે હવે બંને છે.
Summary
Key takeaways
- csv.reader હરોળને STRINGS ની lists તરીકે આપે છે; સંખ્યાઓ int()/float() થી ફેરવો; header ને next() થી કૂદો.
- csv.writer: writerow(list) અને writerows(lists ની list).
- DictReader હરોળને header નાં નામથી ચાવી આપે છે: ખાનાંનો ક્રમ બદલાય તો પણ ટકે છે; DictWriter ને fieldnames વત્તા writeheader() જોઈએ.
- ખાલી લીટીવાળી હરોળ ટાળવા csv ની files ને newline='' સાથે ખોલો (ખાસ કરીને લખતી વખતે).
- Reader સામે DictReader = સ્થાન આધારિત સામે નામ આધારિત પહોંચ.
- Memory hook: તાલીમ પામેલો ટપાલી, સ્થાનથી કે લેબલથી કવર.