如何从文本文件写入csv文件
How to write to csv file from a text file
我有包含如下数据的文本文件:
"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
findall
returns 一个列表。您可能想根据您的用例使用 re.search
或 re.match
。
如果您的 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 调用中的分隔符参数设置。
首先寻找包含 "id"
的行。这条线可以很容易地在 :
处拆分。这会产生一个包含两个元素的列表。取最后一部分并将其转换为整数。
如果行中没有 "id"
,则为 "value1"
行。首先在 :
处拆分行。再次获取结果列表的最后一部分并将其拆分为 "
。这再次导致包含三个元素的列表,我们需要第二个。
在我看来,最简单的方法是使用 pandas 的 read_csv() method and write out using the Dataframe.to_csv() 方法读取 .txt 文件。
下面我创建了一个完全可重现的示例,重新创建 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 文件:
我有包含如下数据的文本文件:
"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
findall
returns 一个列表。您可能想根据您的用例使用 re.search
或 re.match
。
如果您的 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 调用中的分隔符参数设置。
首先寻找包含 "id"
的行。这条线可以很容易地在 :
处拆分。这会产生一个包含两个元素的列表。取最后一部分并将其转换为整数。
如果行中没有 "id"
,则为 "value1"
行。首先在 :
处拆分行。再次获取结果列表的最后一部分并将其拆分为 "
。这再次导致包含三个元素的列表,我们需要第二个。
在我看来,最简单的方法是使用 pandas 的 read_csv() method and write out using the Dataframe.to_csv() 方法读取 .txt 文件。
下面我创建了一个完全可重现的示例,重新创建 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 文件: