【问题标题】:Python - My output is reversed in the CSVPython - 我的输出在 CSV 中反转
【发布时间】:2021-05-19 13:36:35
【问题描述】:

此程序扫描目录中的文件,并使用 REGEX(模式)提取数据。

我遇到的问题是输出如下:

程序的输出如下:

它打印正确,但 CSV 只需要一个条目,并且没有正确分配给列。 我想知道程序不会这样做

['EE-Data,DEC23,144009,TO,From,0000', 'FF-Data,DEC23,144009,TO,From,0000', 'GG-Data,DEC23,144009,TO,From,0000', 'HH-Data,DEC23,144009,TO,From,0000']
file2.TXT
['AA-Data,DEC23,144009,TO,From,0000', 'BB-DATA,DEC23,144509,TO,From,0000', 'CC-Data,DEC23,144009,TO,From,0000', 'DD-Data,DEC23,144009,TO,From,0000']
file1.TXT

但是在 CSV 中这样做

['AA-Data']['DEC23']['144009']['TO']['From']['0000']['File1.TXT']
['']['']['']['']['']['']['']
['']['']['']['']['']['']['']
['']['']['']['']['']['']['']
ETC 

如果我想添加更多模式,它们将进入每一行等。

# use regex on a directory of files and copy into a CSV
import re
import glob
import csv
import os


#Pattern REGEX configuration
patternCPECCC1 = "\/CC(.*?)\/C1"
patternCPET5S6 = "\/T5(.*?)\/S6"


path = "/test/"

#CSV headers
header = ['Column1', 'Column2', 'Column3', 'Column4', 'Column5', 'Column6', 'Column7'] # add more as I expand out the Patterns

# to search DIR defined in path
for files in glob.glob(path +"*.TXT"):
    infile = open(files)
    fin = infile.read()
    pat1 = re.findall(patternCPECCC1, fin)
##### to check what is coming from this for loop #########
    filename = os.path.basename(infile.name)
    print(pat1)
    print(filename)
######################################

with open('R.csv', 'w', newline='') as csvf:

    writer = csv.writer(csvf)
    writer.writerow(header)
    writer.writerow(pat1)
    writer.writerow([filename])

任何帮助将不胜感激,我已阅读 CSV 页面并了解其中的一些元素,我需要一些帮助来思考我的方法。谢谢

【问题讨论】:

  • 您在循环中分配给pat1,每次都会覆盖循环上一次迭代的值。如果你想要 all pat1 值,你要么需要在同一个循环中写出它们(换句话说,同时打开输入和输出文件),要么累积所有列表(或其他此类容器)中的值,以便您可以将它们全部写入第二个循环中。
  • 嗨,杰森,感谢您在这里的输入。当我 print(pat1) 时,我会在屏幕上显示值,因此它在两个文件中找到了 4 次模式 - 总共 8 次。我想以上述格式将相同的信息输入 CSV,因此如果有意义,则为 8 行 7 列。我需要将模式搜索的输出放入 CSV 循环中以更新行。

标签: python regex csv


【解决方案1】:

如果没有合适的.txt 文件,这有点难以测试,但您需要将脚本重组为如下内容:

# use regex on a directory of files and copy into a CSV
import re
import glob
import csv
import os
import io

#Pattern REGEX configuration
patternCPECCC1 = "\/CC(.*?)\/C1"
patternCPET5S6 = "\/T5(.*?)\/S6"
path = "/test/"

#CSV headers
header = ['Column1', 'Column2', 'Column3', 'Column4', 'Column5', 'Column6', 'Column7'] # add more as I expand out the Patterns

with open('R.csv', 'w', newline='') as csvf:
    writer = csv.writer(csvf)
    writer.writerow(header)
    
    # to search DIR defined in path
    for filename in glob.glob(path + "*.TXT"):
        with open(filename) as f_txt:
            data = f_txt.read()
            basename = f_txt.name
        
        pat1 = re.findall(patternCPECCC1, data)

        ##### to check what is coming from this for loop #########
        print(pat1)
        print(basename)
        ######################################

        rows = [next(csv.reader(io.StringIO(row))) + [basename] for row in pat1]
        writer.writerows(rows)
  1. 在处理所有 .txt 文件时,您需要保持 CSV 文件处于打开状态。
  2. pat1 的每个元素都是包含所有行的单个字符串。您需要使用 csv.reader() 将其拆分为值。这可以使用io.StringIO 来使字符串看起来像一个文件。
  3. 您需要将文件名添加到每一行的末尾。
  4. 然后您可以使用.writerows() 同时写入所有行

【讨论】:

  • 嗨马丁,谢谢你,我知道这是怎么回事,老实说我不知道​​那个 StringIO ,我将进一步研究它以了解它的全部内容.无论如何它都有效,我将pat1 放入第 1-7 列的单元格中,我通过 REGEX 采用的模式在每个单元格中。如果我想在 CSV 中在 pat1 旁边添加说 pat2pat3 等,我会用什么方法呢?非常感谢您的帮助。
  • 如果我想在 CSV 中的 pat1 旁边添加 say pat2 和 pat3 等,我会用什么方法呢?
  • 这取决于它是在同一行还是在新行上。另外,如果pat2pat3 中的行数与pat1 中的行数相同。
  • 好吧,在同一行,我想和pat1做同样的事情,但是把pat2放在第8、9、10列等,然后把pat3放在@987654338旁边的同一行@所以每一行都会有pat1pat2pat3等。行数相同。
  • 您可能需要使用zip 将多个项目组合在一起。我建议你开始一个新问题。您应该从.txt 文件中添加一个示例条目并显示您想要的输出。我觉得另一种方法会更好,但需要查看原始数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多