Add columns to CSV while writing the CSV

前端 未结 2 664
感动是毒
感动是毒 2020-12-07 04:57

I am writing on the fly the following data in a csv:

name first file parsed                    
STEP ID  ELEMENT_ID  Fatigue SW  Fatigue F1  Fat         


        
2条回答
  •  爱一瞬间的悲伤
    2020-12-07 05:59

    You cannot add columns to an existing CSV file; you'll have to rewrite the whole file, I'm afraid.

    You can use the following context manager to make replacing a file a little easier:

    from contextlib import contextmanager
    import io
    import os
    
    
    @contextmanager
    def inplace(filename, mode='r', buffering=-1, encoding=None, errors=None,
                newline=None, backup_extension=None):
        """Allow for a file to be replaced with new content.
    
        yields a tuple of (readable, writable) file objects, where writable
        replaces readable.
    
        If an exception occurs, the old file is restored, removing the
        written data.
    
        mode should *not* use 'w', 'a' or '+'; only read-only-modes are supported.
    
        """
    
        # move existing file to backup, create new file with same permissions
        # borrowed extensively from the fileinput module
        if set(mode) & set('wa+'):
            raise ValueError('Only read-only file modes can be used')
    
        backupfilename = filename + (backup_extension or os.extsep + 'bak')
        try:
            os.unlink(backupfilename)
        except os.error:
            pass
        os.rename(filename, backupfilename)
        readable = io.open(backupfilename, mode, buffering=buffering,
                           encoding=encoding, errors=errors, newline=newline)
        try:
            perm = os.fstat(readable.fileno()).st_mode
        except OSError:
            writable = open(filename, 'w' + mode.replace('r', ''),
                            buffering=buffering, encoding=encoding, errors=errors,
                            newline=newline)
        else:
            os_mode = os.O_CREAT | os.O_WRONLY | os.O_TRUNC
            if hasattr(os, 'O_BINARY'):
                os_mode |= os.O_BINARY
            fd = os.open(filename, os_mode, perm)
            writable = io.open(fd, "w" + mode.replace('r', ''), buffering=buffering,
                               encoding=encoding, errors=errors, newline=newline)
            try:
                if hasattr(os, 'chmod'):
                    os.chmod(filename, perm)
            except OSError:
                pass
        try:
            yield readable, writable
        except Exception:
            # move backup back
            try:
                os.unlink(filename)
            except os.error:
                pass
            os.rename(backupfilename, filename)
            raise
        finally:
            readable.close()
            writable.close()
            try:
                os.unlink(backupfilename)
            except os.error:
                pass
    

    Use this with the csv module to add columns:

    with inplace(csvfilename, 'rb') as (infh, outfh):
        reader = csv.reader(infh)
        writer = csv.writer(outfh)
    
        for row in reader:
            row += ['new', 'column']
            writer.writerow(row)
    

提交回复
热议问题