2

私はPythonスクリプトにかなり慣れていないので、ディレクトリとサブディレクトリ内のファイル名を確認したいと考えています. 検証では大文字と小文字を区別する必要があります。私はpython 2.6.5 OSを使用しています:win7とxp

次のユーザー入力を求めます。

prompt = "year"
year = raw_input(prompt)
prompt = "number"
number = raw_input(prompt)

ここから、次のファイルとフォルダーが存在し、それらのファイル名が正しいことを検索/確認したいと思います。

フォルダ構造:

..\foobar_(number)_version1\music

サブフォルダー「music」内のファイル

(year)_foobar_(number)_isnice.txt
(year)_itis(number)hot_today.txt
(year)_anything_is(number)possible.txt
(year)_something_{idont_want_to_check_this_part}_(number)_canbe_anything.txt

() または {} の間のものを除いて、アンダースコアを含むすべてのテキストは常に同じであるため、常に正しいはずです。ファイル名が正しいかどうかを報告するtxtファイルに結果を出力したい。

これをアーカイブするための最も論理的な方法は何ですか? ライブラリ ドキュメント fnmatch(.fnmatchcase)、RE、および os(.path.isfile) を読み、ここで例を検索しましたが、どこからどのように開始すればよいかわかりません。

誰かが私を正しい方向に向けることができますか?

[編集] スクリプトの基本が動作するようになり次第、参照用または他の人を助けるためにコードを投稿します。

[edit2] 私の最初の非 Hello World スクリプト

import os
import re

#output :
file_out = "H:\\output.txt"
f_out = open(file_out, 'w')

print "-------start-script----------"

#input
prompt = "enter 4 digit year: "
year = raw_input(prompt)
prompt = "enter 2 digit number: "
number = raw_input(prompt)

print "the chosen year is %s" % (year)
print "the chosen number is %s" % (number)

f_out.write ("start log!\n")
f_out.write ("------------------------------------------\n")
f_out.write ("the chosen year is %s\n" % (year))
f_out.write ("the chosen number is %s\n" % (number))

#part i'm working on

print "end script"
f_out.write ("------------------------------------------\n")
f_out.write ("end script\n")

#close file
f_out.close()
4

3 に答える 3

2

globモジュールを見てください。これは、現在のディレクトリ内のファイルのリストを取得するのに役立ちます。

import glob

year = raw_input('Year: ')        # Example: Year: 2009
number = raw_input('Number: ')    # Example: Number: 12
filenames = glob.glob('{year}_*{number}*'.format(year=year, number=number))

ファイル名は、次の基準を満たす現在のディレクトリ内の任意のものになります。

  1. で始まる2009_
  2. 一致するまでの任意の数の文字12
  3. に続く任意の数の文字12

os.path.existsこれは、ファイルが存在するかos.path.isfileどうか、またはファイルのような名前のディレクトリではなく、実際にファイルであることを確認するための良い方法です。Python3の場合は、これらのドキュメントを確認してください。前述のghostbust555のリンクのように、存在を確認する以外のことを行う場合は、競合状態に注意してください。


あなたのコメントによると、これは正規表現の仕事のようです。作成する必要があるものの擬似コードは、次のようになります。

for filename in list of filenames:
    if filename is not valid:
        print "<filename> is not valid!"

実際のパターンを除けば、実際のP​​ythonコードは次のようになります。

import os
import re

pattern = 'Put your actual pattern here'

# For a different directory, change the . to whatever the directory should be
for filename in os.listdir('.'):
    if not re.match(pattern, filename):
        print("Bad filename: ", filename)
于 2012-07-25T15:17:54.617 に答える
0

これは完全な回答ではなく、@Wayne Wernerの回答の拡張です。評判ポイントが足りないのでコメントしません。;0

フォーマットを使用したウェインのアプローチは、ファイルがビルドされた後ではなくビルドされる前にファイル名を検証しているため、何をすべきかを示していると思います。そして、それはあなたがしていることであり、コントロールしているようですか?

  1. ユーザー入力レベルで可能な限り多くの検証を行います。
  2. 入手した場所から他のパーツを検証します。
  3. 部品を使って辞書を作成します。
  4. file_name をビルドします。

たとえば、ユーザー入力レベルでは、次のようになります。

yourDict = dict() 

year_input = raw_input('What is the year'?)

if not year_input.isdigit():  
    year_input = raw_input('Only digits please in the format YYYY, example: 2012'):

yourDict[year] = year_input

次に、あなたが持っている基準によって他の値を検証することにより、key:values を yourDict に追加し続けます。(reモジュールまたは他の方法を使用してください)。

次に、ウェインが行っていたように、渡された辞書で .format() を使用して、正しい部分にマップします。

format1 = "{year}{part1}{number}{part2}.txt".format(**yourDict)

このアプローチでは、同じ部分を使用して新しい形式をすばやく作成することもできます。また、各形式に必要なキーと不要なキーをディクショナリで選択できます。

お役に立てば幸いです。

于 2012-07-25T15:58:03.227 に答える
-1
import os.path

year = 2009
file1 = year + "_foobar_" + number + "_isnice.txt"

os.path.exists(file1)   
于 2012-07-25T15:10:12.637 に答える