如何使用 Python 将日期、时间、序列号、部件等写入 csv 文件?
How do I write date, time, serial, part, etc... to csv file using Python?
在进入 for 循环并获取日期值之前,代码可以正常工作。之后它 returns 一个空的值列表,用于其余变量,如时间、ref1、系列和所有。
import pandas as pd
import re
# Create a Dataframe from CSV
my_dataframe = pd.read_csv('C:/Users/WI/Desktop/file.csv')
# Drop rows with any empty cells
my_dataframe.dropna(axis=0, how='any', thresh=None, subset=['date'], inplace=False)
with open("C:/Users/WDSI/Desktop/OutputFile.txt", "w") as F:
F.write("%s" %my_dataframe)
fin = open("C:/Users/WDSI/Desktop/OutputFile.txt", "r")
# print("Input file is taken")
fout = open("C:/Users/WDSI/Desktop/OutputFile1.txt", "w")
# print("Output file is taken")
for line in fin:
date = re.findall(r'(\d{4}-\d{2}-\d{2})', fin.read())
time = re.findall(r'(\s\d{2}:\d{2}:\d{2})',fin.read())
seriel=re.findall(r'(\s[A-Z][A-Z][A-Z][0-9])',fin.read())
part=re.findall(r'(\s[0-9][0-9][0-9][A-Z][0-9][0-9][0-9][0-9][0-9])',fin.read())
ref1=re.findall(r'(\s\d{16})',fin.read())
ref3=re.findall(r'(\d{9})+$',fin.read())
#print(date)
#print(time)
#print(seriel)
#print(part)
#print(ref1)
#print(ref3)
fout.write("%10s,%8s" %((date,time)))
fout.close()
当我们 运行 此代码仅日期变量获取其他变量(如时间、ref1 等)的值时,所有变量都为空。也请帮我从 csv 文件的每一行写日期、时间、序列号、部分、ref1、ref3。应以这种格式写入输出文件。
您正在使用 for line in fin
逐行阅读,但首先您的所有 findall
使用 fin.read()
读取整个文件内容。
您要么逐行处理(将 fin.read()
替换为 line
):
for line in fin:
date = re.findall(r'(\d{4}-\d{2}-\d{2})', line)
...
或者读取整个文件并删除 for
:
content = f.read()
date = re.findall(r'(\d{4}-\d{2}-\d{2})', content)
...
这不是您的解决方案的精确复制品,而是您如何打开一个文件并从每一行中获取您需要的任何内容,然后将新数据写入一个新文件。
我准备了一个包含以下行的 csv 文件:
This is a date 2019-08-05, 2019-09-03
This is a email asdfasdf@abc.com
解决方案 1:
with open("./Datalake/output.txt", "w+") as wf:
with open("./Datalake/test.csv") as f:
for line in f:
dates = re.findall(r"\d{4}-\d{1,2}-\d{1,2}", line)
dates = "|".join(dates)
emails = re.findall(r'[\w\.-]+@[\w\.-]+', line)
emails = "|".join(emails)
extracted_line = "{}, {}\n".format(dates, emails)
wf.write(extracted_line)
print(extracted_line)
解决方案 2:
您可以直接从数据框中提取。使用将为每一行执行的 lambda 函数应用相同的搜索。但是要小心,如果列中有 None 值,您可能需要一些错误处理 lambda 函数来解决错误。在应用 lambda 之前将列转换为 str
。
df = pd.read_csv("./Datalake/test.csv", sep='\n', header=None, names=["string_col"])
df['dates'] = df["string_col"].apply(lambda x: re.findall(r"\d{4}-\d{1,2}-\d{1,2}", x))
df['emails'] = df["string_col"].apply(lambda x: re.findall(r"[\w\.-]+@[\w\.-]+", x))
在这种情况下,计算列将是一个 python 列表,因此您可以考虑在 lambda 中使用 ''.join()
将它们设为文本。
在进入 for 循环并获取日期值之前,代码可以正常工作。之后它 returns 一个空的值列表,用于其余变量,如时间、ref1、系列和所有。
import pandas as pd
import re
# Create a Dataframe from CSV
my_dataframe = pd.read_csv('C:/Users/WI/Desktop/file.csv')
# Drop rows with any empty cells
my_dataframe.dropna(axis=0, how='any', thresh=None, subset=['date'], inplace=False)
with open("C:/Users/WDSI/Desktop/OutputFile.txt", "w") as F:
F.write("%s" %my_dataframe)
fin = open("C:/Users/WDSI/Desktop/OutputFile.txt", "r")
# print("Input file is taken")
fout = open("C:/Users/WDSI/Desktop/OutputFile1.txt", "w")
# print("Output file is taken")
for line in fin:
date = re.findall(r'(\d{4}-\d{2}-\d{2})', fin.read())
time = re.findall(r'(\s\d{2}:\d{2}:\d{2})',fin.read())
seriel=re.findall(r'(\s[A-Z][A-Z][A-Z][0-9])',fin.read())
part=re.findall(r'(\s[0-9][0-9][0-9][A-Z][0-9][0-9][0-9][0-9][0-9])',fin.read())
ref1=re.findall(r'(\s\d{16})',fin.read())
ref3=re.findall(r'(\d{9})+$',fin.read())
#print(date)
#print(time)
#print(seriel)
#print(part)
#print(ref1)
#print(ref3)
fout.write("%10s,%8s" %((date,time)))
fout.close()
当我们 运行 此代码仅日期变量获取其他变量(如时间、ref1 等)的值时,所有变量都为空。也请帮我从 csv 文件的每一行写日期、时间、序列号、部分、ref1、ref3。应以这种格式写入输出文件。
您正在使用 for line in fin
逐行阅读,但首先您的所有 findall
使用 fin.read()
读取整个文件内容。
您要么逐行处理(将 fin.read()
替换为 line
):
for line in fin:
date = re.findall(r'(\d{4}-\d{2}-\d{2})', line)
...
或者读取整个文件并删除 for
:
content = f.read()
date = re.findall(r'(\d{4}-\d{2}-\d{2})', content)
...
这不是您的解决方案的精确复制品,而是您如何打开一个文件并从每一行中获取您需要的任何内容,然后将新数据写入一个新文件。
我准备了一个包含以下行的 csv 文件:
This is a date 2019-08-05, 2019-09-03
This is a email asdfasdf@abc.com
解决方案 1:
with open("./Datalake/output.txt", "w+") as wf:
with open("./Datalake/test.csv") as f:
for line in f:
dates = re.findall(r"\d{4}-\d{1,2}-\d{1,2}", line)
dates = "|".join(dates)
emails = re.findall(r'[\w\.-]+@[\w\.-]+', line)
emails = "|".join(emails)
extracted_line = "{}, {}\n".format(dates, emails)
wf.write(extracted_line)
print(extracted_line)
解决方案 2:
您可以直接从数据框中提取。使用将为每一行执行的 lambda 函数应用相同的搜索。但是要小心,如果列中有 None 值,您可能需要一些错误处理 lambda 函数来解决错误。在应用 lambda 之前将列转换为 str
。
df = pd.read_csv("./Datalake/test.csv", sep='\n', header=None, names=["string_col"])
df['dates'] = df["string_col"].apply(lambda x: re.findall(r"\d{4}-\d{1,2}-\d{1,2}", x))
df['emails'] = df["string_col"].apply(lambda x: re.findall(r"[\w\.-]+@[\w\.-]+", x))
在这种情况下,计算列将是一个 python 列表,因此您可以考虑在 lambda 中使用 ''.join()
将它们设为文本。