【问题标题】:How do I read a list surrounded in double quotes from a csv file?如何从 csv 文件中读取用双引号括起来的列表?
【发布时间】:2020-09-18 10:55:04
【问题描述】:

我正在创建一个票证跟踪项目,其中有一个保存票证信息的 pandas 数据框。然后我将此数据框存储到一个 csv 文件中。数据框将在程序开始时初始化。

其中一个列值是一个列表。当您使用以下代码行将 pandas 数据框存储在 csv 文件中时:self.ticketDF.to_csv(self.ticketCSVFilePath),它会用双引号将列表括起来。然后,当您将其读回时,它现在被解释为字符串,而不是列表。在我的示例中,您可以在 cmets 列下看到带有双引号的列表。

这是我的文件 - tickets.csv:

Ticket ID,Subject,Project,Description,Priority,Comments
PROT-18,testSubject,testProject,testDescription,testPriority,"['comment1', 'comment2', 'comment3']"
PROT-19,testSubject,testProject,testDescription,testPriority,"['comment4', 'comment5', 'comment6']"

我正在初始化 pandas 数据框,使用这两个函数:

def initializeTicketDF(self):
   if path.exists(self.ticketCSVFilePath) and path.getsize(self.ticketCSVFilePath) > 0:
       self.ticketDF = pd.read_csv(self.ticketCSVFilePath)  #reading the csv file into the dataframe
       self.ticketDF.set_index('Ticket ID', inplace=True)   #I am setting the index to the Ticket ID
       self.columnToList("Comments")                        #Calling my function that currently does the 
                                                            #workaround

def columnToList(self, columnName):
   count = 0                                #this represents the current row in the dataframe
   for x in self.ticketDF['Comments']:      #x holds the "Comments" value for every row
       x = x.replace('[', '')               #replace left and right brackets
       x = x.replace(']', '')
       x = re.findall('\'([^\']*)\'', x)    #get a list of all values between single quotes
       self.ticketDF[columnName][count] = x #store the list back into the dataframe
       count += 1 

如上所示,要解决此问题,我将分别替换每个括号,然后使用以下行获取单引号之间所有值的列表:x = re.findall('\'([^\']*)\'', x) 然后我将列表逐行存储回数据帧中。

我也尝试过使用 csv.DictReader/Writer,它做同样的事情。

有没有一种方法可以读取 csv 中的列表而无需进行任何字符串修改?有没有可以用来清理列表字符串的正则表达式?

任何想法将不胜感激。谢谢!

【问题讨论】:

标签: python regex pandas csv dataframe


【解决方案1】:

您可以将转换后的列传递给pd.read_csv():

import pandas as pd
from ast import literal_eval

p = pd.read_csv(path, converters={'Comments':literal_eval})

p['Comments']
# 0    [comment1, comment2, comment3]
# 1    [comment4, comment5, comment6]

p['Comments'][0][1]
# 'comment2'

literal_eval 将安全地评估像您的列表这样的简单表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 2016-06-01
    • 2016-06-06
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多