मैं कुछ डेटा पढ़ने और इसे सीएसवी के रूप में पार्स करने की कोशिश कर रहा हूं। प्रश्न में डेटा प्रारूप एक निराला पहली पंक्ति के साथ आता है जिसे मुझे सबसे पहले छुटकारा पाने की आवश्यकता है।

delimiter = None
with open('data.csv', 'r', encoding='latin1') as fd:
    input1 = io.StringIO(fd.read())

with open('data.csv', 'r', encoding='latin1') as fd:
    input2 = io.StringIO()
    for line in fd:
        if line.startswith('sep='):
            delimiter = line[4]
        else:
            input2.write(line)

with open('data.csv', 'r', encoding='latin1') as fd:
    buf = ''
    for line in fd:
        if line.startswith('sep='):
            delimiter = line[4]
        else:
            buf += line
    input3 = io.StringIO(buf)

इस मामले में कि मैं वास्तव में उस पहली पंक्ति में जोड़ता हूं, फिर input1.getvalue() == input2.getvalue() == input3.getvalue()। और अगर मैं नहीं तो कम से कम input2.getvalue() == input3.getvalue()।

फिर सीएसवी बिट आता है:

inputReader = csv.DictReader(inputX, delimiter=delimiter or ';')
for row in inputReader:
    print(row)

यह इनपुट 1 के लिए काम करता है, लेकिन निराला पहली पंक्ति के कारण यह कॉलम नामों को गड़बड़ कर देता है, जैसा कि अपेक्षित था।

यह इनपुट 3 के लिए सही कॉलम नामों के साथ काम करता है। मैं उत्सुक हूं कि क्यों लूप इनपुट 2 के लिए कोई परिणाम नहीं देता है। उस समय input2 और input3 में क्या अंतर है?

0
Al Smith 6 अप्रैल 2020, 13:03
क्योंकि कर्सर input2 में फ़ाइल के अंत में है
 – 
juanpa.arrivillaga
6 अप्रैल 2020, 13:11

1 उत्तर

input2 "फ़ाइल" के अंत में स्थित है, जबकि एक स्ट्रिंग से StringIO का निर्माण सीधे फ़ाइल की स्थिति को शुरुआत में रखता है।

input2 कोड को ठीक करने के लिए, लिखने के बाद शुरुआत में वापस जाएं:

input2.seek(0)
1
user2357112 supports Monica 6 अप्रैल 2020, 13:06