当试图使用列表作为要保留的文件的引用来删除csv文件中的行时,它会删除所有内容

  • 本文关键字:删除 文件 csv 引用 列表 保留 python csv
  • 更新时间 :
  • 英文 :


我正试图删除csv文件中列";国家;与我的countryList不匹配。

到目前为止,它一直在运行,除了删除我文档中的所有内容外,没有任何错误。

import csv
countryList = ['Azerbaijan', 'Belarus', 'China', 'Estonia', 'Finland', 'Georgia', 'Kazakhstan', 'Latvia', 'Lithuania', 'Mongolia', 'North Korea', 'Norway', 'Poland', 'Ukraine', 'United States', 'Venezuala']
file = "C:\Capstone\Data\WIID_30JUN2022_Altered.csv"
with open(file, "r") as inCountryName:
csvReader = csv.reader(inCountryName)
header = next(csvReader)    
countryIndex = header.index("country")
with open(file,"w") as outCountryName:
writer = csv.writer(outCountryName)
for row in csv.reader(inCountryName):
name = row[countryIndex]
for country in countryList:
if name!= countryList:
writer.writerow(row)

我对这些建议做了一些修改。

我看到两个问题导致了一些问题:

  1. 我相信,您的文件正在被删除,因为您正试图在文件打开供阅读时对其进行写入。我在Mac上,所以我实际上没有得到一个被删除的文件,所以我现在只是猜测,在Windows和Python之间,写入一个已经打开的文件是一个问题。

    总的来说,我建议不要尝试在同一个通行证中阅读和写作,我绝对建议不要按照你所读的内容写作(如果这是有效的话?(。如果你的代码有问题,你可以删除你的输入。当您无法比较之前和之后时,这也会使调试变得困难。

    相反,读入一个中间列表,然后写出该列表。一旦您对输出感到满意,就可以使用操作系统(如果需要,可以使用Python(将输出文件移动/重命名为您想要的任何文件。

  2. 你过滤国家的逻辑是错误的;这就是@juanpa.arrivilaga的意思,他们说,";使用"in";,如:

    if country_name not in countries:
    filtered_rows.append(row)
    

我模拟了这个小样本输入CSV:

country,capital
Belarus,Minsk
Kiribati,South Tarawa 
Marshall Islands,Majuro
United States,Washington D.C.

我的代码看起来与您发布的非常不同:我自由地使变量更加Python化;当打开与csv的读取器和写入器一起使用的文件时,我们需要指定newline="quot;为了避免损坏CSV文件中的有效换行符:

import csv
countries = ["Azerbaijan", "Belarus", "United States"]
filtered_rows = []
with open("input.csv", "r", newline="") as f:
reader = csv.reader(f)
header = next(reader)
filtered_rows.append(header)  # keep header for output
country_idx = header.index("country")
for row in reader:
country_name = row[country_idx]
if country_name not in countries:
filtered_rows.append(row)

with open("output.csv", "w", newline="") as f:
writer = csv.writer(f)
writer.writerows(filtered_rows)

假设你知道";国家;按名称列,您可能喜欢使用csv的DictReader和DictWriter;您可以避免显式地获取标题并查找列的索引:

filtered_rows = []
with open("input.csv", "r", newline="") as f:
reader = csv.DictReader(f)
for row in reader:
if row["country"] not in countries:
filtered_rows.append(row)

print(filtered_rows)  # a list of dicts, keyed to your column names
# [
#     {'country': 'Kiribati', 'capital': 'South Tarawa '},
#     {'country': 'Marshall Islands', 'capital': 'Majuro'}
# ]

with open("output.csv", "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=filtered_rows[0])
writer.writeheader()
writer.writerows(filtered_rows)

您需要将某种可迭代性传递给fieldnames=,过滤行的第一行(dict(可以很好地实现这一点。

回到第1期,我建议不要在循环中做太多事情,我以前甚至写过这样的CSV处理器:

countries = ["Azerbaijan", "Belarus", "United States"]
all_rows = []
with open("input.csv", "r", newline="") as f:
reader = csv.DictReader(f)
all_rows = list(reader)
filtered_rows = []
for row in all_rows:
if row["country"] not in countries:
filtered_rows.append(row)
row1 = filtered_rows[0]
with open("output.csv", "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=row1)
writer.writeheader()
writer.writerows(filtered_rows)

只是为了让我在修改数据时能够非常清楚地了解自己,而不是仅仅试图读入或写出数据:这非常清楚发生了什么。如果有帮助的话。祝你好运

最新更新