【问题标题】:How to update a csv file without appending new rows using python?如何在不使用 python 追加新行的情况下更新 csv 文件?
【发布时间】:2020-01-23 04:53:15
【问题描述】:

我有一个 power shell 脚本和 python 脚本,可以将数据写入一个常见的 CSV 文件。如果我在 python 脚本中使用关键字“w+”,它会删除旧数据并替换为新数据。如果我使用关键字“a+”,它会继续附加不受欢迎的数据。现在我正在尝试只更新 CSV 文件的特定键列中的值。

我需要帮助来了解如何解决它。

  Test.csv =>includes =>

  Param_Name,Param_Value
  p_resource_name,res123   #prints from powershell script
  p_tag_name,tag123        #prints from powershell script
  p_instance_count,0       #prints from Python script
  p_volume_count,0         #prints from Python script


  Powershell.ps1=>
   $file_path="C:\test.csv"
   $csv = Import-Csv -Path $file_path
   $result = Foreach ($row in $csv)
   {
    $row  
   if ($row.Param_Name -eq "p_instance_count") { $row.Param_Value = $instance}
   if ($row.Param_Name -eq "p_volume_count") { $row.Param_Value = $volume}
   }

  Python.py =>

   f = csv.writer(codecs.open("C:/test.csv", "ab"), lineterminator="\n")

   instances = conn.instances.filter(Filters=[{'Name': 'instance-state-name', 
   'Values': ['running', 'stopped']}])
  for instance in instances:
      instance_count.append(instance)
      instanceCount = str(len(instance_count))
  f.writerow(('p_instance_count', len(instance_count)))

所以这是我的代码,首先我运行 Powershell,它应该更新 csv,然后我运行一个 python 脚本,它再次使用计数更新相同的 CSV。

谁能推荐一个更新它的好方法。

【问题讨论】:

    标签: python python-2.7 powershell csv


    【解决方案1】:

    这个问题对我来说似乎不是很清楚。当你想更新一个 CSV 文件时,你必须读取它,在内存中修改它,并在其整个中重写新创建的实例列表。

    instances = conn.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running', 'stopped']}]) for instance in instances: instance_count.append(instance) instanceCount = str(len(instance_count))

    顺便说一句,请注意对python2.7的支持将在4个月内结束...您应该切换到python3

    instances 变量仅包含您要更改的行(据我了解)

    instance_count 是一个新列表,应包含原始列表中的所有行。

    【讨论】:

      【解决方案2】:

      csv 文件是一个顺序 文件。因此,您甚至不应该考虑在不重写整个文件的情况下更改字段中的值。当然也有例外,但我建议这样做太容易出错了。

      常见的方法是读取文件,写入副本并在成功时重命名所有内容。标准库 fileinput 模块带有一个 inplace=True 选项,可以在后台执行此操作:

      如果关键字参数 inplace=True 被传递给 fileinput.input() 或 FileInput 构造函数,则文件被移动到备份文件并且标准输出被定向到输入文件(如果与备份文件已经存在,它将被静默替换)。这使得编写一个过滤器来重写其输入文件成为可能。

      【讨论】:

      • 你能举一些例子来说明如何写一个副本并重命名为成功。
      猜你喜欢
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      相关资源
      最近更新 更多