Finding Blank Columns in CSV

Jaydip Chakrabarty chalao.adda at gmail.com
Tue Oct 6 13:23:31 EDT 2015


On Tue, 06 Oct 2015 14:33:51 +0200, Peter Otten wrote:

> Jaydip Chakrabarty wrote:
> 
>> On Tue, 06 Oct 2015 01:34:17 +1100, Chris Angelico wrote:
>> 
>>> On Tue, Oct 6, 2015 at 1:06 AM, Tim Chase
>>> <python.list at tim.thechases.com> wrote:
>>>> That way, if you determine by line 3 that your million-row CSV file
>>>> has no blank columns, you can get away with not processing all
>>>> million rows.
>>> 
>>> Sure, although that effectively means the entire job is moot. I kinda
>>> assume that the OP knows that there are some blank columns (maybe lots
>>> of them). The extra check is unnecessary unless it's actually
>>> plausible that there'll be no blanks whatsoever.
>>> 
>>> Incidentally, you have an ordered_headers list which is the blank
>>> columns in order; I think the OP was looking for a list of the
>>> _non_blank columns. But that's a trivial difference, easy to tweak.
>>> 
>>> ChrisA
>> 
>> Thanks to you all. I got it this far. But while writing back to another
>> csv file, I got this error - "ValueError: dict contains fields not in
>> fieldnames: None". Here is my code.
>> 
>> rdr = csv.DictReader(fin, delimiter=',')
>> header_set = set(rdr.fieldnames)
>> for r in rdr:
>>     header_set = set(h for h in header_set if not r[h])
>>     if not header_set:
>>         break
>> 
>> for r in rdr:
>>     data = list(r[i] for i in header_set)
>> 
>> dw = csv.DictWriter(fout, header_set)
>> dw.writeheader()
>> dw.writerows(data)
> 
> Sorry, this is not the code you ran. I could guess what the missing
> parts might be, but it is easier for both sides if you provide a small
> script that actually can be executed and a small dataset that shows the
> behaviour you describe. Then post the session and especially the
> traceback. Example:
> 
> $ cat my_data.csv 0
> $ cat my_code.py print 1/int(open("my_data.csv").read())
> $ python my_code.py Traceback (most recent call last):
>   File "my_code.py", line 1, in <module>
>     print 1/int(open("my_data.csv").read())
> ZeroDivisionError: integer division or modulo by zero
> 
> Don't retype, use cut and paste. Thank you.

I downloaded gmail contacts in google csv format. There are so many 
columns. So I was trying to create another csv with the required columns. 
Now when I tried to open the gmail csv file with csv DictReader, it said 
the file contained NULL characters.
So first I did - 

data = open(fn, 'rb').read()
fout = open(ofn, 'wb')
fout.write(data.replace('\x00', ''))
fout.close()
shutil.move(ofn, fn)

Then I found, there were some special characters in the file. So, once 
again I opened the file and did -

data = open(fn, 'rb').read()
fout = open(ofn, 'wb')
fout.write(data.replace('\xff\xfe', ''))
fout.close()
shutil.move(ofn, fn)

Now it seemed right. So I started to remove empty columns. 

fin = open(fn, 'rb')
fout = open(ofn, 'wb')

rdr = csv.DictReader(fin, delimiter=',')
flds = rdr.fieldnames
header_set = set(rdr.fieldnames)
for r in rdr:
    header_set = set(h for h in header_set if not r[h])
    if not header_set:
        break
for r in rdr:
    data = list(r[i] for i in header_set)

dw = csv.DictWriter(fout, data[0].keys())
dw.writeheader()
dw.writerows(data)

fin.close()
fout.close()

But, I am getting error at dw.writerows(data). I put the whole code here. 
Please help.

Thanks.




More information about the Python-list mailing list