【问题标题】:append new row to old csv file python将新行追加到旧的csv文件python
【发布时间】:2011-01-22 18:03:56
【问题描述】:

我正在尝试向我的旧 csv 文件添加一个新行。基本上,每次我运行 Python 脚本时它都会更新。

现在我将旧的 csv 行值存储在一个列表中,然后删除 csv 文件并使用新的列表值再次创建它。

想知道有没有更好的方法来做到这一点。

【问题讨论】:

    标签: python csv append writer


    【解决方案1】:

    我使用以下方法在 .csv 文件中追加新行:

    pose_x = 1 
    pose_y = 2
    
    with open('path-to-your-csv-file.csv', mode='a') as file_:
        file_.write("{},{}".format(pose_x, pose_y))
        file_.write("\n")  # Next line.
    

    [注意]:

    • mode='a' 是追加模式。

    【讨论】:

    • 是否可以通过这种方式循环遍历行并在每行下附加一个新行?
    • @santma 是的。您可以使用for 来执行此操作。
    【解决方案2】:

    如果您使用 pandas,您可以通过这种方式将数据框附加到现有的 CSV 文件中:

    df.to_csv('log.csv', mode='a', index=False, header=False)
    

    使用 mode='a' 我们确保我们追加而不是覆盖,并且使用 header=False 我们确保我们只追加 df 行的值,而不是 header + 值。

    【讨论】:

      【解决方案3】:

      我更喜欢使用标准库中的csv 模块和with 语句的解决方案,以避免文件处于打开状态。

      关键是在打开文件时使用'a'进行追加。

      import csv   
      fields=['first','second','third']
      with open(r'name', 'a') as f:
          writer = csv.writer(f)
          writer.writerow(fields)
      

      如果您使用的是 Python 2.7,您可能会在 Windows 中遇到多余的新行。您可以尝试使用'ab' 而不是'a' 来避免它们,但是,这将导致您在Python 3.6 中使用TypeError: a bytes-like object is required, not 'str' in python and CSV。正如 Natacha 建议的那样,添加 newline='' 将导致您 a backward incompatibility between Python 2 and 3

      【讨论】:

      • 可能出现的烦人问题:如果 csv 文件不以换行符结尾,这将扩展最后一行而不是添加新行。
      • 这是问题的更好答案,应标记为正确答案。 csv 包确保格式正确,实际上我想不出使用纯文本优于 csv 的任何优势。
      • 对我来说,这段代码添加了多余的新行,所以我在这一行中添加了newline=''with open(r'name', 'a', newline='') as f:(windows,python 3.9)
      【解决方案4】:

      如果文件存在且包含数据,则可以自动为csv.DictWriter生成fieldname参数:

      # read header automatically
      with open(myFile, "r") as f:
          reader = csv.reader(f)
          for header in reader:
              break
      
      # add row to CSV file
      with open(myFile, "a", newline='') as f:
          writer = csv.DictWriter(f, fieldnames=header)
          writer.writerow(myDict)
      

      【讨论】:

        【解决方案5】:
        # I like using the codecs opening in a with 
        field_names = ['latitude', 'longitude', 'date', 'user', 'text']
        with codecs.open(filename,"ab", encoding='utf-8') as logfile:
            logger = csv.DictWriter(logfile, fieldnames=field_names)
            logger.writeheader()
        
        # some more code stuff 
        
            for video in aList:
                video_result = {}                                     
                video_result['date'] = video['snippet']['publishedAt']
                video_result['user'] = video['id']
                video_result['text'] = video['snippet']['description'].encode('utf8')
                logger.writerow(video_result) 
        

        【讨论】:

        • 请修正缩进。答案也受益于解释 - 这些答案也吸引了更多的支持。
        • 这是一些简单的代码,它以追加模式打开文件,写出头文件rec,然后处理aList中的视频记录。
        【解决方案6】:
        with open('document.csv','a') as fd:
            fd.write(myCsvRow)
        

        使用'a' 参数打开文件允许您追加到文件的末尾,而不是简单地覆盖现有内容。试试看。

        【讨论】:

        • 我试过 fp = open(csv_filepathwithname, 'wa') writer = csv.writer(fp) somelist = [ 3,56,3,6,56] writer.writerow((somelist)) 但是只有最后一行被追加到文件中。
        • 该方法假定被附加的项目是逗号分隔的,但情况可能并不总是如此。那么 write 方法将不会维护 csv 分隔符。从这个意义上说,下面的答案更可靠。
        【解决方案7】:

        根据@GM 的回答并注意@John La Rooy 的警告,我能够在'a'mode 中附加一个打开文件的新行。

        即使在windows中,为了避免换行问题,也必须声明为newline=''

        现在您可以在'a'mode(不带 b)下打开文件。

        import csv
        
        with open(r'names.csv', 'a', newline='') as csvfile:
            fieldnames = ['This','aNew']
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        
            writer.writerow({'This':'is', 'aNew':'Row'})
        

        我没有尝试使用普通作家(没有字典),但我认为它也可以。

        【讨论】:

          【解决方案8】:

          你是用“a”模式而不是“w”模式打开文件吗?

          请参阅 Python 文档中的 Reading and Writing Files

          7.2。读写文件

          open() 返回一个文件对象,最常与两个参数一起使用:open(filename, mode)。

          >>> f = open('workfile', 'w')
          >>> print f <open file 'workfile', mode 'w' at 80a0960>
          

          第一个参数是一个包含文件名的字符串。第二个论点是 另一个包含几个字符的字符串,描述其中的方式 该文件将被使用。模式可以是 'r' 当文件将只 读取,'w' 仅用于写入(同名的现有文件将 被删除),并且“a”打开文件以进行附加;写入的任何数据 该文件会自动添加到末尾。 'r+' 打开文件 阅读和写作。 mode 参数是可选的; 'r' 将是 假设它被省略了。

          在 Windows 上,附加到模式的 'b' 以二进制模式打开文件,所以 还有像“rb”、“wb”和“r+b”这样的模式。 Windows 上的 Python 区分文本文件和二进制文件;行尾 文本文件中的字符在数据时会自动稍微改变 被读或写。这种对文件数据的幕后修改 对 ASCII 文本文件很好,但它会破坏这样的二进制数据 在 JPEG 或 EXE 文件中。阅读时要非常小心使用二进制模式 并编写此类文件。在 Unix 上,将 'b' 附加到 模式,因此您可以独立于平台使用它来处理所有二进制文件 文件。

          【讨论】:

          • 也许你可以让你的答案更详细,然后它看起来像一个真正的答案:-)
          • @user,我添加了一个链接 - 这对你有帮助吗?
          猜你喜欢
          • 2019-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-03
          • 2014-04-11
          相关资源
          最近更新 更多