【问题标题】:Write data to a csv file Python将数据写入 csv 文件 Python
【发布时间】:2015-01-21 15:44:24
【问题描述】:

我的数据如下所示

['[\'Patient, A\', \'G\', \'P\', \'RNA\']']

无论括号、引号和反斜杠如何,我都想用“,”分隔数据并写入如下所示的 CSV 文件

Patient,A,G,P,RNA

提及分隔符 = ',' 没有任何帮助。然后输出文件看起来像

['Patient, A','G','P','RNA']

全部在一个单元格中。我想将它们分成多列。我该怎么做?

编辑 - 提到 quotechar='|' 将它们分成不同的单元格,但现在看起来像

|['Patient, A','G','P','RNA']|

编辑-

out_file_handle = csv.writer(out_file, quotechar='|', lineterminator='\n', delimiter = ",")
data = ''.join(mydict.get(word.lower(), word) for word in re.split('(\W+)', transposed))
data = [data,]
out_file_handle.writerow(data)

转置:

['Patient, A','G','P','RNA']

数据:

['[\'Patient, A\', \'G\', \'P\', \'RNA\']']

而且它有多行,上面是整个数据中的一行。

【问题讨论】:

  • 可以帮助您入门的东西:docs.python.org/2/library/csv.html#csv.writer
  • @BorrajaX 谢谢。我就是这样尝试的。我尝试了多种方法,提到方言、分隔符、换行符,但没有任何效果。也许我在看东西。如果您能帮我解决这个问题,我将不胜感激。
  • 您能否编辑您的问题以显示更具体的代码示例?也许我们能够发现一些东西?谢谢
  • list 的开头有一个string,它看起来像一个列表。 Patient A 将是一个元素(它们将占据 csv 文件中的相同单元格)。这就是你想要的吗?
  • @Beginner No. 他们应该在两个不同的单元格中。

标签: python python-2.7 csv export-to-csv


【解决方案1】:

您首先需要将此数据读入 Python 数组,方法是将字符串作为 CSV 文件在内存中处理:

from StringIO import StringIO
import csv
data = ['[\'Patient, A\', \'G\', \'P\', \'RNA\']']
clean_data = list(csv.reader( StringIO(data[0]) ))

但是输出仍然是单个字符串,因为它甚至不是格式正确的 CSV!在这种情况下,最好的办法可能是过滤掉所有这些垃圾字符?

import re
clean_data = re.sub("[\[\]']","",data[0])

现在 data[0] 是 'Patient, A, G, P, RNA',这是一个干净的 CSV,您可以直接写入文件。

【讨论】:

  • 为什么使用restring.replace() 也可以呢?它更快、更清晰。
  • 执行re 引擎的单次传递应该比string.replace() 引擎的三次传递更快地删除所有不同的垃圾字符:[] 和@987654330 @(如果有其他例子,可能更多)。
  • 如果我们可以确定 [] 字符在开头和结尾,那么您是正确的,代码可以读取:clean_data = data[0][1:-1].replace('\'','')
  • [] 总是在开头和结尾,所以 string[1:-1] 可以做到这一点。只需要string.replace("\'","")[1:-1]。为什么使用正则表达式完全过分?
  • 不,鉴于引号字符的分布不一致,没有理由期望括号符合任何类型的标准模式。看起来 OP 正在清理垃圾数据,可能会有更多字符需要过滤,再加上一轮空白清理。
【解决方案2】:

如果您要做的是以['[\'Patient, A\', \'G\', \'P\', \'RNA\']'] 的形式将数据写入文件,其中您有这些字符串的数组,那么这确实是一个分为两部分的问题。

首先是如何将数据分离成正确的格式,其次是写入文件。

如果这是您的数据的形式,对于每一行,那么这样的东西应该可以工作(将其转换为正确的格式):

data = ['[\'Patient, A\', \'G\', \'P\', \'RNA\']', ...]
newData = [entry.replace("\'", "")[1:-1].split(",") for entry in data]

这将为您提供以下形式的数据:

[["Patient", "A", "G", "P", "RNA"], ...]

然后您可以按照其他答案中的建议将其写入文件;

with open('new.csv', 'wb') as write_file:
  file_writer = csv.writer(write_file)
  for dataEntry in range(newData ):
    file_writer.writerow(dataEntry)

如果您实际上并不关心使用这一轮中的数据,而只是想清理它,那么您可以直接执行data.replace("\'", "")[1:-1],然后将这些字符串写入文件。

[1:-1] 位仅用于删除前导方括号和尾随方括号。

【讨论】:

    【解决方案3】:

    Python 有一个 CSV 写入器。从

    开始
    import csv
    

    然后尝试这样的事情

    with open('new.csv', 'wb') as write_file:
        file_writer = csv.writer(write_file)
        for i in range(data):
            file_writer.writerow([x for x in data[i]])
    

    编辑:

    在写入数据之前,您可能需要先处理一下数据,因为它看起来像是一个字符串,而不是一个列表。尝试使用 split() 函数

    list = data.split()
    

    【讨论】:

    • 谢谢。但它实际上是一个列表。
    【解决方案4】:
    """
                                 SAVING DATA INTO CSV FORMAT
        * This format is used for many purposes, mainly for deep learning.
        * This type of file can be used to view data in MS Excel or any similar 
          Application
    """
    # == Imports ===================================================================
    
    import csv
    import sys
    
    # == Initialisation Function ===================================================
    
    def initialise_csvlog(filename, fields):
        """
        Initilisation this function before using the Inserction function
    
        * This Function checks the data before adding new one in order to maintain
          perfect mechanisum of insertion
        * It check the file if not exists then it creates a new one
        * if it exists then it proceeds with getting fields
    
        Parameters
        ----------
        filename : String
            Filename along with directory which need to be created
        Fields : List
            Colomns That need to be initialised
    
        """
        try :
            with open(filename,'r') as csvfile:
                csvreader = csv.reader(csvfile)
                fields = csvreader.next()
                print("Data Already Exists")
                sys.exit("Please Create a new empty file")
                # print fields  
        except :
            with open(filename,'w') as csvfile:
    
                csvwriter = csv.writer(csvfile)
                csvwriter.writerow(fields)
    
    # == Data Insertion Function ===================================================
    
    def write_data_csv(filename, row_data):
        """
        This Function save the Row Data into the CSV Created
        * This adds the row data that is Double Listed
    
        Parameters
        ----------
        filename : String
            Filename along with directory which need to be created
        row_data : List
            Double Listed consisting of row data and column elements in a list  
        """
        with open(filename,'a') as csvfile:
    
            csvwriter = csv.writer(csvfile)
            csvwriter.writerows(row_data)
    
    if __name__ == '__main__':
        """
        This function is used to test the Feature Run it independently
    
        NOTE: DATA IN row_data MUST BE IN THE FOLLOWING DOUBLE LISTED AS SHOWN
        """
        filename = "TestCSV.csv"
        fields = ["sno","Name","Work","Department"]
        #Init
        initialise_csvlog(filename,fields)
        #Add Data
        row_data = [["1","Jhon","Coder","Pythonic"]]
        write_data_csv(filename,row_data)
    
    # == END =======================================================================
    

    阅读模块,您可以开始使用 CSV 并在 Excel 或任何类似应用程序中查看数据(在 libreoffice 中计算)

    注意:请记住将要双重列出的数据列表如__main__ 函数(row_data)所示

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 2016-02-10
      • 1970-01-01
      相关资源
      最近更新 更多