【问题标题】:writing the contents of a list to a csv file将列表的内容写入 csv 文件
【发布时间】:2018-04-22 13:14:30
【问题描述】:

我正在使用下面的代码将列表的内容写入 csv 文件。

    import csv

    text_file = open("memberstest.txt", "r")
    lines = text_file.read().split(' ')
    print(lines)


    myfile = open('members.csv','w')
    wr = csv.writer(myfile, delimiter=" ")
    wr.writerows(lines)
    myfile.close()

我遇到的问题是每个单词都写入一个新行,而不是将每个记录保存在单独的行中。例如,我的列表如下所示:

["['user1',", "'01/01/01',", "'blue',", "'green'['user2',", "'12/12/12',", "'pink',", "'orange']['user3',", "'03/03/03',", "'purple',", "'green']"] 

当我执行我的代码时,我的 csv 文件如下所示:

[ ' u s e r 1 ' 

' 0 1 / 0 1 / 0 1 ' 

' b l u e ' 

' g r e e n ' ] [ ' u s e r 2 ' 

' 1 2 / 1 2 / 1 2 ' 

' p i n k ' 

' o r a n g e ' ] [ ' u s e r 3 ' 

' 0 3 / 0 3 / 0 3 ' 

' p u r p l e ' 

' g r e e n ' ]

它在每个单词和它连接在一起的每条记录中的最后一项和第一项之后留下一个行间隙。

我想看到的是:

user 1   01/01/01   blue  green
user 2   12/12/12   pink   orange

等等

我已经为分隔符尝试了不同的选项,甚至没有尝试过,但我没有取得太大的成功。任何指向正确方向的指针都将不胜感激。

【问题讨论】:

  • 那是因为您提供的列表(或者更确切地说,文件中的列表) csv 文件正在写出的列表。尝试测试 lines[0]lines[3] 以查看列表在您阅读后的样子。
  • 不,抱歉,没有达到预期的效果。不仅如上所示打印,而且一条记录中的最后一个单词和下一条记录中的第一个单词总是显示为连接的。
  • 这就是我要说的——你的输入列表已经搞砸了,所以在你的脚本中纠正它需要付出很大的努力。尝试修复列表中正在读取的文件,您的脚本应该可以按预期运行。对于上下文,如果您也向我们提供memberstest.txt 中的内容,将会很有帮助。
  • 好的,感谢您的回复。自从我最初发布以来,我一直在研究这个问题,所以我想提供我在纠正问题方面取得的进展。我将首先说明我是如何写到 memberstest.txt 的。然后我将显示文件的内容。然后使用用户的新密码编辑该文件并写回文本文件,因为当我尝试写入 csv 文件时,由于某种奇怪的原因,它会留下最后一项(管理员或访问权限)。我将通过添加“回答您的问题”来做到这一点。我现在大部分时间都在那里,因为我离得太近了。

标签: python list csv export-to-csv


【解决方案1】:

我首先将一个新用户写入一个文本文件:

import time
import csv

    account = input("Do you want to create an OCRtunes account? Y/N  ")
    if account == "Y" or account == "y":

        adduser = []
        user = str(input("enter user: "))
        adduser.append(user.strip())
        print("----------------------------------------------")
        username = input("enter your username: ")
        adduser.append(username.strip())
        print("-----------------------------------------------")
        password = input("enter password: ")
        adduser.append(password.strip())
        print("------------------------------------------------")
        rights = input("enter admin or client: ")
        adduser.append(rights.strip() + "\n")
        print(adduser)
        -------------------")
        reply = input("Do you want these details to be saved? ")

        if reply =="Y" or reply =="y":

            with open('memberstestv2.txt', 'a') as f:
                str(adduser)
                f.writelines(",".join(adduser))
                print (adduser)
                f.close()

            print("User created")

memberstest2.txt 文件中的详细信息保存如下:

user1,username1,password1,admin
user2,username2,password2,access
user3,username3,password3,access

然后,当我想为用户编辑密码并写回同一个文件或新的 csv 文件时:

with open('memberstestv2.txt') as fo:
    user = []
    updated_list = []

    for rec in fo:
        user.append(rec.split(','))

    print(user)
    username=input("Enter username: ")

    for row in user:
        for field in row:
            if username == field:
                updated_list.append(row)
                print("user found")
                password = input("enter new password: ")
                updated_list[0][2] = password
                print(updated_list)

                for index, row in enumerate(user):
                    for field in row:
                        if field == updated_list[0]:
                            user[index] = updated_list # Replace old record with updated record.


                with open("memberstestv2.txt","w", newline='') as f:
                    Writer=csv.writer(f)
                    Writer.writerows(user)
                    print("password has been updated")

                exit

在控制台中,输出如下所示:

[['user1', 'username1', 'password1', 'admin\n'], ['user2', 'username2', 'password2', 'access\n'], ['user3', 'username3', 'password3', 'access']]
Enter username: user1
user found
enter new password: new password
[['user1', 'username1', 'new password', 'admin\n']]
password has been updated

但是,在文本文件中,数据保存在最后一项周围的引号中,例如:

user1,username1,new password,"admin
"
user2,username2,password2,"access
"
user3,username3,password3,access

如果我继续更新另一个密码,控制台中的结果是:

[['user1', 'username1', 'new password', '"admin\n'], ['"\n'], ['user2', 'username2', 'password2', '"access\n'], ['"\n'], ['user3', 'username3', 'password3', 'access\n']]
Enter username: user2
user found
enter new password: new password 2
[['user2', 'username2', 'new password 2', '"access\n']]
password has been updated

在文本文件中保存为:

user1,username1,new password,"""admin
"
"""
"
user2,username2,new password 2,"""access
"
"""
"
user3,username3,password3,"access
"

似乎每次更新密码时都会添加引号。如果我尝试写入 csv 文件,它可以工作,但不会写入最后一列。

任何指针表示赞赏。

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    相关资源
    最近更新 更多