2

ファイルのようなオブジェクトとして取得する前に、Python を使用して tar アーカイブ内の特定のファイルの存在を確認したいと考えています。で試してみましたisreg()が、おそらく何か間違っています。

Python でファイルが tar アーカイブに存在するかどうかを確認するにはどうすればよいですか?

私は試した

import tarfile


tar = tarfile.open("sample.tar", "w")
tar.add("test1.txt")
tar.add("test2.txt")
tar.add("test3.py")
tar.close()

tar = tarfile.open("sample.tar", "r")
tai = tar.tarinfo(name="test3.py")
print(tai.isreg())
print(tai.size())
tar.close()

おそらくタイは間違っています。実際tai.size()は常に 0 です。

4

4 に答える 4

6

本当に確認する必要がある場合は、getnamesメソッドとin演算子を使用してメンバーシップをテストできます。

>>> import tarfile
>>> tar = tarfile.open("sample.tar", "w")
>>> "sample.tar" in tar.getnames()
True

ただし、Python (および一般的なファイル システムの処理) では、例外のキャッチが優先されると思います。ファイルの存在を確認してから後で読み取るまでの間、常に何かが発生する可能性があるため、例外の読み取りとキャッチを試みることをお勧めします。

>>> try:
...     tar.getmember('contents.txt')
... except KeyError:
...     pass
...
于 2010-11-14T23:53:09.427 に答える
0

たぶん使用しgetnames()ますか?

tar = tarfile.open('sample.tar','r')
if 'test3.py' in tar.getnames():
    print 'test3.py is in sample.tar'
于 2010-11-14T23:52:47.353 に答える
0

tar.getnames()in演算子を使用してそれを行うことができます:

$ touch a.txt
$ tar cvf a.tar a.txt
$ python
>>> names = tarfile.open('a.tar').getnames()
>>> 'a.txt' in names
True
>>> 'b.txt' in names
False
于 2010-11-14T23:53:10.300 に答える
0

これは、tar ファイルのサブディレクトリにファイル名がある場合でも一致し、normcase を使用して、現在の OS のファイル名の大文字と小文字の処理を模倣します (たとえば、Windows では、「readme.txt」を検索すると、tar ファイル内の「README.TXT」と一致する必要があります)。 )。

def filename_in_tar(filename, atarfile):
    filename= os.path.normcase(filename)
    return any(
        filename == os.path.normcase(os.path.basename(tfn))
        for tfn in atarfile.getnames())
于 2010-12-14T08:56:05.707 に答える