【问题标题】:merge some rows in condition在条件下合并一些行
【发布时间】:2020-12-26 02:12:11
【问题描述】:

我想合并条件中的行。如果该行的长度小于 20,则将该行与之前的行合并。 我正在尝试使用此代码,但输出不正确 感谢您的帮助。

import csv 

datam = []
with open("All.csv", 'r', encoding='UTF-8') as f:
  lines = f.readlines()
for line in lines:
    doc = line
    datam.append(doc)
with open('Test.csv', mode = 'w',newline ='',encoding='UTF-8') as f:
    writer = csv.writer(f,delimiter=' ')
    for i, data in enumerate(datam):
        if len(datam)< 20:
            writer.writerow([datam[i-1] + ',' + datam[i]])
            datam.remove(data[i])
        if len(data)>= 20:
            writer.writerow([datam[i]])

【问题讨论】:

  • 为什么输出不正确?请添加一个示例,说明您期望什么以及您的代码会得到什么
  • @Valentino 我添加了一张图片来解释需要什么
  • @snakecharmerb 我想从代码中得到什么,如果行的长度小于 20 个字符,则将此行与上一行合并然后将其删除。代码合并这行少于 20 个字符,但保留两行。我只需要这两行中的一行。请查看图片中的输出和所需的输出。感谢您的回复

标签: python csv


【解决方案1】:

这里有一些问题。

您的代码似乎正在检查datum 的长度——这是行数,而不是特定行的长度。

我们可以通过在每次迭代中始终检查 next 行的长度来重新安排逻辑。如果它小于 20,我们将它与当前行合并并写入输出 CSV;然后删除该行。否则,我们只需将当前行写入 CSV。

有一个边缘情况,我们在输入 CSV 的最后一行,在这种情况下,我们没有后续行要检查,所以我们直接将该行写入输出 CSV。

最后,开头的代码可以大大简化。这有点令人困惑,因为您将源文件读入lines,然后将其逐行复制到datam。你可以做到这一点。

此外,还有一个小错误,即原始文件将包含换行符,您需要删除这些换行符。

以下内容应该适合您:

import csv 

with open('All.csv', 'r', encoding='utf-8') as f:
  datam = [l.strip() for l in f.readlines()]

with open('Test.csv', mode='w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f, delimiter=' ')
    rows = []
    for i, data in enumerate(datam):
        if i + 1 == len(datam):
            writer.writerow([data])
        elif len(datam[i + 1]) < 20:
            writer.writerow([data + ',' + datam[i + 1]])
            datam.remove(datam[i + 1])
        elif len(datam[i + 1]) >= 20:
            writer.writerow([data])

【讨论】:

  • 这段代码给了我同样的旧结果。我在问题中添加了一张图片,解释了需要什么。非常感谢您的帮助
  • @user14462764 请查看更新的响应,它应该会产生预期的输出,原来解决的问题略有不同
  • 代码现在是正确的。非常感谢您的帮助
  • 我有一个问题。如果我想应用相同的过程,但在新情况下,我有两列,我想在第二列的代码中应用条件,如果任何行少于 20 个字符,则执行相同的过程删除两列的行跨度>
  • 好的,谢谢您的回复
猜你喜欢
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 2012-05-01
  • 2020-11-11
  • 2016-03-30
  • 2017-11-28
相关资源
最近更新 更多