Add columns to CSV while writing the CSV

前端 未结 2 656
感动是毒
感动是毒 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:50
    1. Define a class that represents the original row of data (such as OriginalData).
    2. Define a second class that derives from the first class, and includes properties for each of the new columns (such as NewData).
    3. Create a constructor on NewData that takes an OriginalData as an argument. Have it copy the data from OriginalData into itself.
    4. Overload ToString() on NewData so that it returns a string in the format that you want it to appear in the target file.
    5. While you're iterating over the lines, read them into an OriginalData instance.
    6. Once the originalData instance is loaded, copy the data into a NewData instance, and populate the new properties to include your data.
    7. Write the data from NewData to the target file by calling NewData's ToString() method.
    0 讨论(0)
  • 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)
    
    0 讨论(0)
提交回复
热议问题