2016-11-03 17 views
-1

現在、3DプリンタにビルドされているFTPサーバーにディレクトリからファイルをアップロードするPythonスクリプトで作業しています。アップロードとFTPのすべてが動作しますが、私はスクリプトのためにやるべき特定のタスクがあります。私は開始ディレクトリに多くのファイルをダンプしたい。だから、のように行く:古い名前の一部を使用している間に、古い名前の一部を使用しながら、Pythonでファイル名を変更します。

  1. 1474lapfab.tgz
  2. 1475lapfab.tgz
  3. ... lapfab.tgz
  4. ..........

私が欲しいです最初のファイルを取得して名前を変更するスクリプトは、ftpサーバにlapfab.tgz(lapfab.tgzがプリンタが反応するファイル名であるため、この名前でなければならない)を送信するだけです。しかし、ここに特定の部分があります。私は最初に番号を保持する新しい変数が欲しいので、プリンタが現在作業しているプロジェクトの現在の数を表示することができます。

マイコードこれまで

# -*- coding: cp1252 -*- 
#geschrieben in Python 2.7.1 
#Drucker Rechts 
import ftplib 
import os 

meinftp = ftplib.FTP("192.168.178.178") 
meinftp.login("anonymous") 

directory = '/data/todo/'        #Ftp Main Directory 
meinftp.cwd(directory)         #Login to right ftp directory 
directory_local='/home/pi/testprogramme/python/'  #Local upload directory 
filename = 'lapfab.tgz' 

print "Open file" 
print 
file = open(directory_local+filename, 'rb')    #Open file in Binary 

print "Upload File" 

meinftp.storbinary('Stor '+filename, file)    #File Transfer 

print 
print "Upload Complete" 
print 
print 'The local File ' + filename +' will close.' 

file.close() 

print 
print meinftp.quit()         #Kill Conection 
print 
print 'FTP-Connection cut.' 

os.remove('lapfab')          #Deleting the main File from server 

print 
print "Deleting Main File from Server" 

誰かがここでの私の仕事が終わっgehtから右のトラックに私を送ることができれば、それは素晴らしい以上になります!

おはようございます。

よろしくエディ=)

EDIT:

#!/usr/bin/python 
# -*- coding: cp1252 -*- 
#geschrieben in Python 2.7.1 
#Drucker Rechts 
import ftplib, os, re, fnmatch 

meinftp = ftplib.FTP("192.168.178.178") 
meinftp.login("anonymous") 

directory = '/data/todo/'        #Ftp Main Directory 
meinftp.cwd(directory)         #Login to right ftp directory 
directory_local='/home/pi/testprogramme/python/'  #Local upload directory 
filename = 'lapfab.tgz' 

# Capture the matching files. 
file_pattern = "*%s" % filename 
matches = sorted([local_filename for local_filename in os.listdir(directory_local) \ 
if fnmatch.fnmatch(local_filename, file_pattern)]) 

if len(matches) < 0: 
    # Don^^ t process anything, no files 
    exit() 

# Extract the variable 
regex = r"([0-9]+)%s" % filename 
match = re.search(regex, matches[0]) 

# Do something with the file. 
print("Uploading job %s." % match.group(1)) 
full_path = os.path.join(directory_local,matches[0]) 

# Upload the file etc here. 





print "Open file" 
print 
file = open(full_path, 'rb')   #Open file in Binary 

print "Upload File" 

meinftp.storbinary('Stor '+filename, file)    #File Transfer 

print 
print "Upload Complete" 
print 
print 'The local File ' + filename +' will close.' 

file.close() 

print 
print meinftp.quit()         #Kill Conection 
print 
print 'FTP-Connection cut.' 

os.remove(full_path)         #Deleting the main File from server 

print 
print "Deleting Main File from Server" 
print 
print "The File" +full_path+ " was transfered to the Right Printer" 
print 
print 
print "End!" 
print 

が、私は実行するために第2のスクリプトを使用:あなたはこのようなものは、次のコードを使用したいと思います場合

私は、作品これはボタンプッシュで。それは魅力のように機能し、今から私の仕事がより効率的になるのを助けます。 助けてくれてありがとう。素敵なコーディングがあります。 よろしく、 エディ=)

+0

'os.remove( 'lapfab')'はおそらく、その横にあるコメントには何もしません。 –

+0

あなたは部分的に正しいです。それはうまくいくが、コメントは誤解を招く。コメントをドイツ語から英語に翻訳して間違えました。プリンターのサーバーからメインファイルを削除することはありません。 pi自体のメインファイルを削除します。私は唯一のプリンタ上のファイルが必要とpi =ではない) – Eddie

答えて

0

私は右のあなたの質問を読んでいれば、解決するには、2つの部分があります:

  1. は、ローカルディレクトリから複数のファイルをアップロードする方法。
  2. ファイル名から変数名を抽出する方法。

1の場合、os.listdir()を使用してローカルディレクトリ内のファイルのリストを取得できます。 2では、正規表現を使用してファイル名から変数を取り込むことができます。変数をキャプチャするには、カッコ()内の正規表現のキャプチャグループを使用します。正規表現はreモジュールにあります。

import re 

regex = r"([0-9]+)%s" % filename # This will give you r"([0-9]+)lapfab.tgz" 
match = re.search(regex, "1474lapfab.tgz") 
print match.group(0) # This will print out "1474lapfab.tgz". 
print match.group(1) # This will print out "1474". 

次の2つを組み合わせた場合は、ローカルディレクトリを反復処理し、変数名キャプチャすることができます:あなたは役に立つかもしれません正規表現の

import os, re, fnmatch 

directory_local = '/home/pi/testprogramme/python/' #Local upload directory 
filename = 'lapfab.tgz' 

# Capture the matching files. 
file_pattern = "*%s" % filename 
matches = sorted([local_filename for local_filename in os.listdir(directory_local) \ 
if fnmatch.fnmatch(local_filename, file_pattern)]) 

if len(matches) < 0: 
    # Don’t process anything, no files 
    return # or exit() 

# Extract the variable 
regex = r"([0-9]+)%s" % filename 
match = re.search(regex, matches[0]) 

# Do something with the file. 
print("Uploading job %s." % match.group(1)) 
full_path = os.path.join(directory_local,matches[0]) 

# Upload the file etc here. 

いくつかのより多くのリソースを:

  • This page Pythonでの正規表現の使用の概要がよくわかります
  • regex101.comはウィットを演奏するのに便利ですhとデバッグ正規表現を使用して、プログラムの外部で一致するかどうかを確認します。
+0

あなたは私のポイントをかなり得ているが、私は多くのファイルをアップロードしたくない。私は一度に1つのファイルを3Dプリンタにアップロードしたいだけです。 piには、すべてのファイルをアップロードするための独自のftpサーバーがインストールされています。私はプッシュボタンを見て、このスクリプトを起動してリストの次のlapfabファイルを最初の番号に応じてアップロードする別のスクリプトを追加します。 – Eddie

+0

すみません。基本的なアプローチはまだ有効です。一致しないファイルをスキップする答えを編集しました。スクリプトは実行時に正確なファイル名を認識しないので、ディレクトリ内のファイルのリストを取得し、ファイル名のパターンを確認し、一致する場合は処理します。 – hebenon

+0

私はちょうどそれを念入りにしようとします。しかし、1つの質問は、これは、リスト内の最初のファイルを一番小さい番号のファイルを使用しますか?それは私が順番に動作するようにプリンタが必要なので重要です。ご挨拶 – Eddie

関連する問題