【问题标题】:How to write to csv file from a text file如何从文本文件写入 csv 文件
【发布时间】:2021-07-17 16:07:25
【问题描述】:

我有如下数据的文本文件:

"id":0
"value1":"234w-76-54"
"id":1
"value1":"2354w44-7-54"

我想将这些数据保存在 csv 文件中。我尝试使用以下代码,但这是将每个 ids 和 value1 作为列表写入 csv 文件。

with open("log.txt", "r") as file:
    file2 = csv.writer (open("file.csv", "w", newline=""), delimiter=",")
    file2.writerow(["id", "value1"])
        for lines in file:
            if "id" in lines:
                ids = re.findall(r'(\d+)', lines)
            if "value1" in lines:
                value1 = re.findall(r'2[\w\.:-]+', lines)
                file2.writerow([ids, value1])
            

得到输出-

 id         value1
['0']   ['234w-76-54']
['1']   ['2354w44-7-54']

期望的输出-

  id         value1
  0        234w-76-54
  1        2354w44-7-54


       

【问题讨论】:

  • Ehat 关于使用file2.writerow([ids[0], value1[0]])?
  • 使用re.search 而不是re.findall
  • 这行得通,谢谢@BarbarosÖzhan

标签: python csv file-handling xlsxwriter


【解决方案1】:

findall 返回一个列表。您可能想要使用 re.searchre.match,具体取决于您的用例。

【讨论】:

    【解决方案2】:

    如果你的 log.txt 真的有那么简单的结构,你可以使用split()

    import csv
    
    with open("text.txt", "r") as file:
        file2 = csv.writer(open("file.csv", "w", newline=""), delimiter=",")
        file2.writerow(["id", "value1"])
        for line in file:
            if "id" in line:
                ids = int(line.split(":")[-1])
            else:
                value = line.split(":")[-1].split('"')[1]
                file2.writerow([ids, value])
    

    生成的 csv 将包含以下内容:

    id,value1
    0,234w-76-54
    1,2354w44-7-54
    

    逗号作为分隔符由 csv.writer 调用中的 delimiter 参数设置。

    首先查找其中包含"id" 的行。这条线可以很容易地在: 处拆分。这会产生一个包含两个元素的列表。取最后一部分并将其转换为整数。

    如果行中没有"id",则它是"value1" 行。首先在: 处拆分行。再次取出结果列表的最后一部分并将其拆分为"。这再次导致一个包含三个元素的列表,我们需要第二个。

    【讨论】:

      【解决方案3】:

      在我看来,最简单的方法是使用 pandas 的 read_csv() 方法读取 .txt 文件并使用 Dataframe.to_csv() 方法写出。

      下面我创建了一个完全可重现的示例,重新创建 OP 的 .txt 文件,将其读入,然后写出一个新的 .csv 文件。

      import pandas as pd
      
      #Step 0: create the .txt file
      file = open("file.txt","w")
      input = '''"id":0
      "value1":"234w-76-54"
      "id":1
      "value1":"2354w44-7-54"'''
      
      file.writelines(input)
      file.close() 
      
      #Step 1: read in the .txt file and create a dataframe with some manipulation to 
      #        get the desired shape
      df = pd.read_csv('file.txt', delimiter=':', header=None)
      df_out = pd.DataFrame({'id': df.loc[df.iloc[:, 0] == 'id'][1].tolist(),
      'value1': df.loc[df.iloc[:, 0] == 'value1'][1].tolist()})
      print(df_out)
      
      #Step 2: Create a .csv file
      df_out.to_csv('out.csv', index=False)
      

      预期输出的 .csv 文件:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-26
        • 1970-01-01
        • 1970-01-01
        • 2023-02-08
        相关资源
        最近更新 更多