2013-04-03 24 views
8

Birden çok günlük dosyasını ayrıştırmak ve işlenmiş dosyaların listesini korumak için bir komut dosyası yazıyorum. Ben dosyaların listesini okuduğunda ben os.walk kullanmak ve aşağıdakine benzer adları almak işlemek için:Python - Can (veya yapmalıyım) os.path.sep'yi değiştirdim mi?

C:/Users/Python/Documents/Logs\ServerUI04\SystemOut_13.01.01_20.22.25.log 

Bu aşağıdaki kodu tarafından oluşturulur:

filesToProcess.extend(os.path.join(root, filename) for filename in filenames if logFilePatternMatch.match(filename)) 

O "kök" ileri kullanıldığı anlaşılmaktadır ayırıcı olarak eğriler (Ben Windows'dayım ve bunu daha kullanışlı buluyorum) ama "dosya adı" ters eğik çizgi kullanır, bu yüzden ayırıcı olarak ileri ve geri eğik çizgi karışımını içerdiği için dosya için tutarsız bir yolla sonuçlanır.

Birlikte ayırıcı ayarlama denedim:

os.path.sep = "/" 

ve .join önce

os.sep = "/" 

ama hiçbir etkisi var gibi gözüküyor. Teoride, dizeyi manipüle edebildiğimi ancak daha uzun vadede, betiğimin Unix ve Windows üzerinde çalışmasını istediğimi fark ettim, bu yüzden eğer mümkünse dinamik olmasını tercih ederim.

Bir şey mi eksik?

Güncelleme:

benim sorunum kendine zararı olduğu gibi kolaylık olması için böyle kökü olarak kullanılan ilk yolu batmıştı, bakar aşağıda yararlı yanıtları dayanarak

:

logFileFolder = ['C:/Users/Python/Documents/Logs'] 

bunu değiştiğinde Buna:

logFileFolder = ['C:\\Users\\Python\\Documents\\Logs'] 

Her şey çalışır ve sonuçta elde ettiğim dosya yollarının tümü "\" yi kullanır. Benim yaklaşımımın yanlış olduğunu düşündüğümde, Python'u bir değer olarak belirlediğim şeyi düzeltmekten ziyade davranışları değiştirmeye çalışıyorum.

Teşekkür ederiz!

+2

Bir kol çıkmak ve 'ayarı os.sep' muhtemelen doğru olmadığı söylerim vb çapraz OS, web, ftp, çalışacak çözüm. –

+0

olası nüshası [Neden os.path.join kullanımı os.path.sep veya os.sep?] (Http://stackoverflow.com/questions/12086224/why-not-os-path-join-use-os -path-sep-or-os-sep) – BrenBarn

+0

Bu yinelenen soruya işaret eden bir anser olarak, 'os.path' işletim sisteminize bağlı olarak 'posixpath' veya 'ntpath 'içe aktarılarak çalışır. İlginç bir şekilde, bu modüllerin kaynak kodunda, yol ayırıcının 'join' işlevinin içinde bir dize değişmezi olarak kodlanmış olduğunu görebilirsiniz, böylece kendi' join' işlevini yazmadan değiştiremezsiniz. – BrenBarn

cevap

7

Ben os.sep kapalı parmaklarımı tutmak ve kök ve bir dosya adı birleştirerek sonucuna os.path.normpath() kullanır:

filesToProcess.extend(os.path.normpath(os.path.join(root, filename)) 
      for filename in filenames if logFilePatternMatch.match(filename))  
1

Sen olarak os.sep ve os.path.sep dokunmayacağım daha iyi olur os.path.join'un kullandığı değil. Anthon tarafından önerilen şekilde os.path.normpath'u kullanabilirsiniz. Başka bir alternatif kendi basit yolunu sahip olmaktır katılmak: '/' windows ve linux iyi çalışır çünkü

os.sep.join([i1,i2,i3])

4

Ben, bu probelm çözmek için '/'.join([path1, path2]) kullanın.

+1

Bu, her durumda olsa işe yaramaz. Örneğin, 'explorer.exe' sadece '\' ile belirtilen yol argümanlarını kabul eder. – minerz029

0

Aşağıdaki yardımcı program işlevini tercih ettim.

from os.path import sep, join 

def pjoin(*args, **kwargs): 
    return join(*args, **kwargs).replace(sep, '/') 

Bu linux stiline iki varyasyonunu (linux tarzı ve pencereler tarzı) dönüştürür. Hem pencereler hem de linux python'daki '/' ayırıcıyı destekler.

Basit ayırıcıları göz önünde bulundurmadığı için basit os.sep.join (['str', 'str', 'str'])'u reddettim. vanilya vs sep.join ile aşağıdaki durumunu ele alalım katılmak:

In[79]: os.sep.join(['/existing/my/', 'short', 'path']) 
Out[79]: '/existing/my/\\short\\path' 
In[80]: os.path.join('/existing/my/', 'short', 'path') 
Out[80]: '/existing/my/short\\path' 

vanilya önerilen ile tamir edilebilir katılmak:

In[75]: os.path.normpath(os.path.join('/existing/my/', 'short', 'path')) 
Out[75]: '\\existing\\my\\short\\path' 

Şimdiye kadar tanrı. Ama sonra pencerelerden linux ile etkileşime gireceğimiz şu senaryoyu sunuyoruz.

local_path = os.path.normpath(os.path.join('C:\\local\\base', 'subdir', 'filename.txt')) 
remote_path = os.path.normpath(os.path.join('/remote/base', 'subdir', 'filename.txt')) 
sftp_server.upload(local_path, remote_path) 

os.path.normpath pencereler için normalleştirmek olacak iken sftp sunucu bir '/' ayırıcısını beklediği için yukarıdaki sonra başarısız olur '\'.

pjoin fayda fonksiyonu veya benzeri kullanılarak,

İlgili konular