2013-02-14 40 views
18

मैं एक csv फ़ाइल है कि मैं पढ़ आयात सीएसवीपट्टी सफेद रिक्त स्थान

aList=[] 
with open(self.filename, 'r') as f: 
    reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_NONE) 
    for row in reader: 
     aList.append(row) 
    # i need to strip the extra white space from each string in the row 
    return(aList) 

उत्तर

3

से सफेद रिक्त स्थान पट्टी करने के लिए की जरूरत है आप कर सकते हैं:

aList.append([element.strip() for element in row]) 
3
with open(self.filename, 'r') as f: 
    reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_NONE) 
    return [[x.strip() for x in row] for row in reader] 
+0

यह 'सीएसवी' मॉड्यूल का उपयोग कर सबसे अच्छा संभव समाधान है। 'Csv.reader()' फ़ंक्शन द्वारा लौटाई गई 'रीडर' कक्षा 'csv' या '_csv' मॉड्यूल में प्रकट नहीं होती है ताकि उसकी' अगली() 'विधि को ओवरराइड करने की अनुमति मिल सके। – CivFan

24

वहाँ भी है एम्बेडेड स्वरूपण पैरामीटर: skipinitialspace (डिफ़ॉल्ट गलत है) http://docs.python.org/2/library/csv.html#csv-fmt-params

aList=[] 
with open(self.filename, 'r') as f: 
    reader = csv.reader(f, skipinitialspace=False,delimiter=',', quoting=csv.QUOTE_NONE) 
    for row in reader: 
     aList.append(row) 
    return(aList) 
+0

सफेद रिक्त स्थान पट्टी करने के लिए: 'reader = csv.reader (f, skipinitialspace = True, delimiter = ',', quoting = csv.QUOTE_NONE) ', है ना? – Caco

2

आप अपनी फ़ाइल के चारों ओर एक रैपर ऑब्जेक्ट बना सकते हैं जो सीएसवी रीडर उन्हें देखकर रिक्त स्थान को दूर करता है। इस तरह, आप css.DictReader के साथ csv फ़ाइल का भी उपयोग कर सकते हैं।

import re 

class CSVSpaceStripper: 
    def __init__(self, filename): 
    self.fh = open(filename, "r") 
    self.surroundingWhiteSpace = re.compile("\s*;\s*") 
    self.leadingOrTrailingWhiteSpace = re.compile("^\s*|\s*$") 

    def close(self): 
    self.fh.close() 
    self.fh = None 

    def __iter__(self): 
    return self 

    def next(self): 
    line = self.fh.next() 
    line = self.surroundingWhiteSpace.sub(";", line) 
    line = self.leadingOrTrailingWhiteSpace.sub("", line) 
    return line 

तो इस तरह इसका इस्तेमाल:

o = csv.reader(CSVSpaceStripper(filename), delimiter=";") 
o = csv.DictReader(CSVSpaceStripper(filename), delimiter=";") 

मैं ";" hardcoded सीमांकक किया जाना है। किसी भी डेलीमीटर को कोड सामान्य करना पाठक के लिए एक अभ्यास के रूप में छोड़ दिया जाता है।

+0

सामान्य समाधान के लिए इस समाधान का विस्तार 'सीएसवी' मॉड्यूल के पुनः लिखने में समाप्त होगा। – CivFan

6

मेरे मामले में, मैं केवल फ़ील्ड नाम से खाली स्थान के अलग करना (उर्फ कॉलम हैडर शब्दकोश कुंजी उर्फ), जब csv.DictReader उपयोग के बारे में परवाह।

csv.DictReader पर आधारित एक वर्ग बनाएं, और fieldnames संपत्ति को प्रत्येक फ़ील्ड नाम (उर्फ कॉलम हेडर, उर्फ ​​शब्दकोश कुंजी) से व्हाइटस्पेस को बाहर निकालने के लिए ओवरराइड करें।

फ़ील्ड नामों की नियमित सूची प्राप्त करके ऐसा करें, और उसके बाद प्रत्येक फ़ील्ड नाम से छिद्रित व्हाइटस्पेस के साथ एक नई सूची बनाने और इस नई सूची में अंतर्निहित _fieldnames विशेषता को सेट करते समय इसे फिर से चालू करें।

import csv 

class DictReaderStrip(csv.DictReader): 
    @property          
    def fieldnames(self): 
     if self._fieldnames is None: 
      # Initialize self._fieldnames 
      # Note: DictReader is an old-style class, so can't use super() 
      csv.DictReader.fieldnames.fget(self) 
      if self._fieldnames is not None: 
       self._fieldnames = [name.strip() for name in self._fieldnames] 
     return self._fieldnames