如何使用 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() 将它们设为文本。