Python。代码在每一行之后在 csv 文件中留下空白行

Python. Code leaves blank rows in csv file after every row

为什么代码不仅删除 winningRows,而且删除 csv header 行并在每一行后留下空白行?如何解决?我只需要删除winningRows,不需要空行。

def generate():
    global winningRows
    filename = enterFile()

    noOfWinners = 5
    winningNumbers = []
    while len(winningNumbers) < noOfWinners:
        luckyNumber = random.randint(1, totalEntries)
        if luckyNumber not in winningNumbers:
            winningNumbers.append(luckyNumber)

    with open(filename, newline="") as entriesCSV:
        entriesDict = csv.DictReader(entriesCSV,dialect="excel")
        allRows = [row for row in entriesDict]
        winningRows = [row for row in allRows if int(row["#"]) in winningNumbers]
        nonWinningRows = [row for row in allRows if int(row["#"]) not in winningNumbers]
        for row in winningRows:
            winnerName = row["Name"]
            winnerID = row["ID"]
            winnerEmail = row["Email"]
            print(f"The winner is {winnerName}, ID {winnerID}, email {winnerEmail}")

        csv.DictWriter(open(filename, "w"), fieldnames=["#", "Name", "ID", "Email"]).writeheader()
        csv.DictWriter(open(filename, "w"), fieldnames=["#", "Name", "ID", "Email"]).writerows(nonWinningRows)

csv before running the code

csv after running the code

这似乎有效:

with open(filename, newline='\n') as entriesCSV:
    entriesDict = csv.DictReader(entriesCSV,dialect="excel")
    allRows = [row for row in entriesDict]
    winningRows = [row for row in allRows if int(row["#"]) in winningNumbers]
    nonWinningRows = [row for row in allRows if int(row["#"]) not in winningNumbers]
    for row in winningRows:
        winnerName = row["Name"]
        winnerID = row["ID"]
        winnerEmail = row["Email"]
        print(f"The winner is {winnerName}, ID {winnerID}, email {winnerEmail}")

with open(filename, "w", newline='\n') as entriesCSV:
    writer = csv.DictWriter(entriesCSV, fieldnames=["#", "Name", "ID", "Email"])
    writer.writeheader()
    writer.writerows(nonWinningRows)

但在这种情况下,我打开文件两次,对吗?

您同时打开同一个文件多次。没有数据我无法测试这个,但这行得通吗?

with open(filename, newline="") as entriesCSV:
    entriesDict = csv.DictReader(entriesCSV,dialect="excel")

allRows = [row for row in entriesDict]
winningRows = [row for row in allRows if int(row["#"]) in winningNumbers]
nonWinningRows = [row for row in allRows if int(row["#"]) not in winningNumbers]
for row in winningRows:
    winnerName = row["Name"]
    winnerID = row["ID"]
    winnerEmail = row["Email"]
    print(f"The winner is {winnerName}, ID {winnerID}, email {winnerEmail}")

with open(filename, "w") as outputCSV:
    writer = csv.DictWriter(outputCSV, fieldnames=["#", "Name", "ID", "Email"])
    writer.writeheader()
    writer.writerows(nonWinningRows)

您似乎在 Windows。将 newline 参数添加到 open 函数。

with open(filename, "w", newline='\n') as fp:
    writer = csv.DictWriter(fp, fieldnames=["#", "Name", "ID", "Email"])
    writer.writeheader()
    writer.writerows(nonWinningRows)