Python:复制符合要求的行

时间:2013-07-23 21:35:28

标签: python

所以,基本上,我需要一个打开.dat文件的程序,检查每一行是否符合某些先决条件,如果有,请将它们复制到新的csv文件中。

先决条件是它必须1)包含“$ W”或“$ S”和2)让DAT行末尾的最后一个值表示一长串可接受的术语。 (我可以简单地编写术语列表并将它们硬编码到列表中)

例如,如果CSV是购买信息列表,而最后一项是购买的,我只想包含水果。在这种情况下,最后一项是ID标签,我只想接受少数ID标签,但有一个大约5个可接受标签的列表。但是,标签具有非常可靠的长度,但它们始终是列表中的最后一项(并且始终是列表中的第4项)

让我再举一个更好的例子。

我原来的.DAT可能是:

DGH$G$H $2.53 London_Port Gyro

DGH.$WFFT$Q5632 $33.54 55n39 Barkdust

UYKJ$S.52UE $23.57 22#3 Apple

WSIAJSM_33$4.FJ4 $223.4 Ha25%ek Banana

仅限行:“UYKJ $ S $ 23.57 22#3 Apple”将被复制,因为它只有1)$ W或$ S(在这种情况下为$ S)和2)最后一项是水果。一旦制作完.csv文件,我将需要回过头来用逗号替换所有空格,但这对我来说并不像是弄清楚如何扫描每一行的要求而只复制那些被通缉。

我正在制作一些与这个程序非常相似的程序,打开.dat文件,检查每一行以查看它们是否符合要求,然后决定是否将它们复制到新文件中。但遗憾的是,我不知道自己在做什么。它们都足够相似,一旦我弄清楚如何制作一个,其余部分将很容易。

编辑:.DAT文件长达几千行,如果这很重要的话。

EDIT2:我目前的一些代码片段

现在,我目前的版本是:

def main():
    #NewFile_Loc = C:\Users\J18509\Documents
    OldFile_Loc=raw_input("Input File for MCLG:")
    OldFile = open(OldFile_Loc,"r")
    OldText = OldFile.read()
#   for i in range(0, len(OldText)):
#       if (OldText[i] != " "):
#           print OldText[i]
    i = split_line(OldText)
    if u'$S' in i:
        # $S is in the line
        print i
main()

但它仍然非常不稳定。我只是在学习python。

简要更新:我正在处理的服务器已关闭,可能会在接下来的几个小时内完成,但我有新的代码,其中包含语法错误,但无论如何都是这样。一旦我开始工作,我会再次更新。非常感谢大家!

import os
NewFilePath = "A:\test.txt"
Acceptable_Values = ('Apple','Banana')
#Main
def main():
    if os.path.isfile(NewFilePath):
        os.remove(NewFilePath)
    NewFile = open (NewFilePath, 'w')
    NewFile.write('Header 1,','Name Header,','Header 3,','Header 4)
    OldFile_Loc=raw_input("Input File for Program:")
    OldFile = open(OldFile_Loc,"r")
    for line in OldFile:
        LineParts = line.split()
        if (LineParts[0].find($W)) or (LineParts[0].find($S)):
            if LineParts[3] in Acceptable_Values:
                print(LineParts[1], ' is accepted')
                #This Line is acceptable!
                NewFile.write(LineParts[1],',',LineParts[0],',',LineParts[2],',',LineParts[3])
    OldFile.close()
    NewFile.close()
main()

5 个答案:

答案 0 :(得分:1)

您需要实现两个部分:首先,逐行读取文件并写入符合特定条件的行。这是由

完成的
with open('file.dat') as f:
    for line in f:
        stripped = line.strip() # remove '\n' from the end of the line
        if test_line(stripped):
            print stripped # Write to stdout

您要检查的条件在函数test_line中实现。要检查“$ W”或“$ S”的出现,您只需使用in - 运算符

if not '$W' in line and not '$S' in line:
    return False
else:
    return True

要检查,如果行中的最后一项包含在固定列表中,请先使用split()拆分行,然后使用索引表示法[-1]取最后一项(负索引计数来自序列的结尾)然后再次使用in运算符对应固定列表。这看起来像

items = line.split() # items is an array of strings
last_item = items[-1] # take the last element of the array
if last_item in ['Apple', 'Banana']:
    return True
else:
    return False

现在,您将这两部分合并到test_line函数中,如

def test_line(line):
    if not '$W' in line and not '$S' in line:
        return False
    items = line.split() # items is an array of strings
    last_item = items[-1] # take the last element of the array
    if last_item in ['Apple', 'Banana']:
        return True
    else:
        return False

请注意,程序会将结果写入stdout,您可以轻松地重定向。如果要将输出写入文件,请查看Correct way to write line to file in Python

答案 1 :(得分:1)

inlineRequirements = ['$W','$S']
endlineRequirements = ['Apple','Banana']

inputFile = open(input_filename,'rb')
outputFile = open(output_filename,'wb')
for line in inputFile.readlines():
    line = line.strip()
    #trailing and leading whitespace has been removed
    if any(req in line for req in inlineRequirements):
        #passed inline requirement
        lastWord = line.split(' ')[-1]
        if lastWord in endlineRequirements:
            #passed endline requirement
            outputFile.write(line.replace(' ',','))    
            #replaced spaces with commas and wrote to file
inputFile.close()
outputFile.close()

答案 2 :(得分:1)

tags = ['apple', 'banana']
match = ['$W', '$S']
OldFile_Loc=raw_input("Input File for MCLG:")
OldFile = open(OldFile_Loc,"r")
for line in OldFile.readlines(): # Loop through the file
    line = line.strip() # Remove the newline and whitespace
    if line and not line.isspace(): # If the line isn't empty
        lparts = line.split() # Split the line
        if any(tag.lower() == lparts[-1].lower() for tag in tags) and any(c in line for c in match):
            # $S or $W is in the line AND the last section is in tags(case insensitive)
            print line

答案 3 :(得分:0)

import re
list_of_fruits = ["Apple","Bannana",...]
with open('some.dat') as f:
    for line in f:
        if re.findall("\$[SW]",line) and line.split()[-1] in list_of_fruits:
           print "Found:%s" % line

答案 4 :(得分:0)

import os
NewFilePath = "A:\test.txt"
Acceptable_Values = ('Apple','Banana')
#Main
def main():
    if os.path.isfile(NewFilePath):
        os.remove(NewFilePath)
    NewFile = open (NewFilePath, 'w')
    NewFile.write('Header 1,','Name Header,','Header 3,','Header 4)
    OldFile_Loc=raw_input("Input File for Program:")
    OldFile = open(OldFile_Loc,"r")
    for line in OldFile:
        LineParts = line.split()
        if (LineParts[0].find(\$W)) or (LineParts[0].find(\$S)):
            if LineParts[3] in Acceptable_Values:
                print(LineParts[1], ' is accepted')
                #This Line is acceptable!
                NewFile.write(LineParts[1],',',LineParts[0],',',LineParts[2],',',LineParts[3])
    OldFile.close()
    NewFile.close()
main()

这很有效,并且具备我需要的所有功能。其他答案都很好,但是没有一个能像我这样做那样完成我需要的100%。