【问题标题】:Python to exclude only rows from a csv file that is present in another csv filePython仅排除另一个csv文件中存在的csv文件中的行
【发布时间】:2018-09-13 08:50:30
【问题描述】:

尝试编写一个脚本,仅从特定目录下的 csv 文件中排除行,该目录存在于另一个 csv 文件中,并将输出重定向到另一个 csv。这有点像要应用的例外规则。

像下面的输入一样,考虑以下异常:

inDirectory/input.csv:

  Id    Name    Location    Data   Services  Action
  10    John    IN          1234   mail      active
  12    Samy    GR          5678   phone     disable
  28    Doug    UK          9123   phone     active

excDirectory/exception.csv:

  12    Samy    GR          5678   phone     disable

想要重定向输出如下:

outDirectory/output.csv:

  Id    Name    Location    Data   Services  Action
  10    John    IN          1234   mail      active
  28    Doug    UK          9123   phone     active

我能写如下,这是不完整的,我正在寻找一个执行相同的解决方案。任何的想法?我对 Python 脚本非常陌生。

import pandas as pd

inDir = os.listdir('csv_out_tmp')
excFile = pd.read_csv('exclude/exception.csv', sep=',', index_col=0)
for csv in inDir:
  inFile = pd.read_csv('csv_out_tmp/' + csv)
  diff = set(inFile)^set(excFile)
  df[diff].to_csv('csv_out/' + csv, index=False)

我按照@neotrinity 编写的另一种方式代码

inDir = os.listdir('csv_out_tmp')
excFile = 'exclude/exception.csv'
for csv in inDir:
  inFile = open('csv_out_tmp/' + csv)
  excRow = set(open(excFile))
  with open('csv_out/' + csv, 'w') as f:
    for row in open(inFile):
      if row not in excRow:
        f.write(row)

使用上面的代码,我得到的错误如下

for row in open(inFile):
  TypeError: coercing to Unicode: need string or buffer, file found

【问题讨论】:

  • 例外应该是什么?
  • 如果出现在 exception.csv 中的同一行或同一行,则例外。因此输出 csv 只能包含 exception.csv 中不存在的行或行。
  • 我刚刚根据@Max 分享的帖子更新了脚本部分。请让我知道这是否是适当的写作方式或者我需要修改。
  • 发布分享:尝试set(InDir)^set(excFile)(对于那些不知道我分享了什么的人,因为我之前删除了它[以前从未使用过熊猫,所以认为它没有帮助])跨度>

标签: python csv


【解决方案1】:

说实话,你不需要 pandas。

in_file = 'in.csv'
out_file = 'out.csv'
exception_file = 'exp.csv'
exception_rows = set(open(exception_file))
with open('out.csv', 'w') as f:
    for row in open('in.csv'):
        if row not in exception_rows:
            f.write(row)

这使用最少的资源。 只加载内存中的异常文件。

逐行遍历输入文件并写入消耗最少内存的输出文件(逐行)。

之后,您可以使用 pandas 进行数据分析。

【讨论】:

  • 它只是一个 sn-p。不写产品代码¯_(ツ)_/¯。 outfile 通过上下文管理器“正确”关闭。同样的逻辑也适用。
  • 这不仅仅是“sn-p”,它是技术知识数据库中的一个答案,所有经验水平的人都可以阅读——包括完全的新手——因此应该显示出良好的实践。
  • 那应该是第一条评论。不是居高临下的信息,然后是反对票。我很乐意更新 sn-p。
  • @neotrinity 通过以下修改,得到TypeError: coercing to Unicode: need string or buffer, set found. 这是代码inDir = os.listdir('csv_out_tmp') excFile = 'exclude/exception.csv' for csv in inDir: inFile = set(open('csv_out_tmp/' + csv)) excRow = set(open(excFile)) with open('csv_out/' + csv, 'w') as f: for row in open(inFile): if row not in excRow: f.write(row)
  • 这一行inFile = set(open('csv_out_tmp/' + csv)) 不正确。应该只是inFile = open('csv_out_tmp/' + csv)。然而,正如另一位评论者所提到的。最好通过上下文管理器打开文件。
猜你喜欢
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多