පයිතන් හි ගොනුවක් පිටපත් කරන්නේ කෙසේද?


2511

පයිතන් හි ගොනුවක් පිටපත් කරන්නේ කෙසේද?

මට යටින් කිසිවක් සොයාගත නොහැකි විය os.


120
Cp යනු පද්ධති ඇමතුමක් නොවන අතර එම නිසා OS මොඩියුලයට අයත් නොවන බව පෙනේ. එය ෂෙල් විධානයකි, එබැවින් එය ෂටිල් මොඩියුලයට දමා ඇත.
waldol1

Answers:


3050

shutilඔබට භාවිතා කළ හැකි බොහෝ ක්‍රම තිබේ. ඉන් එකක් නම්:

from shutil import copyfile
copyfile(src, dst)
  • Src නම් ගොනුවේ අන්තර්ගතය dst නම් ගොනුවකට පිටපත් කරන්න .
  • ගමනාන්ත ස්ථානය ලිවිය හැකි විය යුතුය; එසේ නොමැති නම්, IOError ව්‍යතිරේකයක් මතු කරනු ඇත.
  • නම් DST දැනටමත් පවතී, එය ප්රතිස්ථාපනය වනු ඇත.
  • අක්ෂර හෝ බ්ලොක් උපාංග සහ පයිප්ප වැනි විශේෂ ලිපිගොනු මෙම ශ්‍රිතය සමඟ පිටපත් කළ නොහැක.
  • පිටපත සමඟ , src සහ dst යනු නූල් ලෙස ලබා දී ඇති මාර්ග නම් වේ.

ඔබ භාවිතා කරන්නේ නම් os.pathමෙහෙයුම්, භාවිතා copyකරනවාට වඩා copyfile. copyfileඇත නූල් නිට්ෂේ .


150
පිටපත් කිරීම සහ පිටපත් කිරීම අතර ඇති වෙනස කුමක්ද?
මැට්

394
පිටපතෙහි (src, dst) dst නාමාවලිය විය හැකිය.
ඕවන්

42
ඔබගේ වේදිකාව මත පදනම්ව සියලු පාර-දත්ත පිටපත් නොවන බව සලකන්න.
කෙවින් හෝන්

14
එය පරමාණුක ක්‍රියාවක් නොවන බව සලකන්න. නූල් යෙදුමක එය භාවිතා කිරීම ගැන සැලකිලිමත් වන්න.
වෝටර්බයිට්

5
එය වැනි කෙටි යෙදුම් හැසිරවිය නොහැකි බව සලකන්න ~, නමුත් එයට සාපේක්ෂ මාර්ග සමඟ කටයුතු කළ හැකිය
zwep

1275
┌──────────────────┬────────┬───────────┬───────┬────────────────┐
│     Function     │ Copies │   Copies  │Can use│   Destination  │
│                  │metadata│permissions│buffer │may be directory│
├──────────────────┼────────┼───────────┼───────┼────────────────┤
│shutil.copy       │   No   │    Yes    │   No  │      Yes       │
│shutil.copyfile   │   No   │     No    │   No  │       No       │
│shutil.copy2      │  Yes   │    Yes    │   No  │      Yes       │
│shutil.copyfileobj│   No   │     No    │  Yes  │       No       │
└──────────────────┴────────┴───────────┴───────┴────────────────┘

නැවත ලිවීම වෙනුවට ගමනාන්තයේ උපග්‍රන්ථ ප්‍රකාරය සමඟ ෂටිල් පිටපතක් ලබා දෙයිද?
සයිඩ් මොහොමඩ් මෙහඩි

741

copy2(src,dst)බොහෝ විට වඩා ප්‍රයෝජනවත් copyfile(src,dst)වන්නේ:

  • එය ඉඩ dstදිය වී බහලුම (ඒ වෙනුවට සම්පූර්ණ ඉලක්කය ගොනු කිරීම), කුමන අවස්ථාවකදී basenamesrcනව ගොනු නිර්මාණය කිරීම සඳහා භාවිතා වේ;
  • එය පාර-දත්ත ගොනුවේ මුල් වෙනස් කිරීම සහ ප්‍රවේශ තොරතුරු (mtime සහ atime) ආරක්ෂා කරයි (කෙසේ වෙතත්, මෙය සුළු පොදු කාර්යයක් සමඟ පැමිණේ).

මෙන්න කෙටි උදාහරණයක්:

import shutil
shutil.copy2('/src/dir/file.ext', '/dst/dir/newname.ext') # complete target filename given
shutil.copy2('/src/file.ext', '/dst/dir') # target filename is /dst/dir/file.ext

19
ලිපිගොනු මිලියනයකින් අහඹු ලෙස 100k ගොනු පිටපත් කිරීමට මම උත්සාහ කරමි. copyfileවඩා සැලකිය යුතු වේගයකින්copy2
විජය

4
shutil.copy2('/dir/file.ext', '/new/dir/')(ඉලක්කගත මාර්ගයෙන් පසු කප්පාදුවක් සහිතව) “dir” නමින් නව ගොනුවකට පිටපත් කළ යුතුද නැතිනම් එම නාමයේ නාමාවලියකට ගොනුව දැමිය යුතුද යන්න පිළිබඳ අපැහැදිලි බව ඉවත් කරනු ඇතැයි මම සිතීම නිවැරදිද ?
සක්

1
@ විජේ මම විශ්වාස කරන්නේ මෙම පොදු කාර්යය පාර-දත්ත පිටපත් කිරීම නිසා ඇති වූවක් බවයි.
ජොනතන් එච්

Ak සක් /new/dirදැනට පවතින නාමාවලියක් නම් අවිනිශ්චිතතාවයක් නොමැත , බලන්න @ මැතිව් ඇල්පර්ට්ගේ අදහස.
ජොනතන් එච්

Ak සාක් ඔබ නිවැරදියි, අවසානයට කප්පාදුවක් එකතු කිරීමෙන් අපැහැදිලි බව ඉවත් වේ. නම් /new/dir/නොපවතියි, Python විසිකිරීම ඇත IsADirectoryError, එසේ නොවන අවස්ථාවන්හීදී එය පිටපත් ලිපිෙගොනුව, /new/dir/මුල් නම යටතේ.
මාර්ටන්බොග්නර්

128

ඔබට shutilපැකේජයෙන් පිටපත් කිරීමේ කාර්යයන්ගෙන් එකක් භාවිතා කළ හැකිය :

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ක්‍රියාකාරී සංරක්ෂණ ආධාරක වෙනත් පිටපත් භාර ගනී
                      අවසර නාමාවලිය dest. ගොනුව obj පාර-දත්ත  
-------------------------------------------------- ----------------------------
shutil.copy               ✔ ✔ ☐ ☐
 shutil.copy2              ✔ ✔ ☐ ✔
 shutil.copyfile           ☐ ☐ ☐
 shutil.copyfileobj        ☐ ☐
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━

උදාහරණයක්:

import shutil
shutil.copy('/etc/hostname', '/var/tmp/testhostname')

11
කුතුහලයෙන් යුතුව, ඔබ එම වගුව ජනනය කළේ කෙසේද?
ආලෝක රසායන විද්‍යා

18
@lightalchemist මම දැන් සීරීම් පෑඩ් ලෙස vim භාවිතා කර, භාවිතා කළ යුනිකෝඩ් සංකේත විකිපීඩියා වගුවකින් පිටපත් කර අවසාන ඔප දැමීම සඳහා ප්‍රති result ලය ස්ටැක් ඕවර්ෆ්ලෝ සංස්කාරකයට පිටපත් කළෙමි.
maxschlepzig

3
අවුරුදු 2 කට පෙර මෙය වෙනත් පිළිතුරකට වඩා වෙනස් වන්නේ කෙසේද? stackoverflow.com/a/30359308/674039
wim

1
imwim, ඔබ මගේ පිළිතුර ඔබ සම්බන්ධ කළ පිළිතුරේ 2017 අනුවාදය සමඟ සැසඳිය යුතුය. ප්‍රධාන වෙනස්කම්: මගේ පිළිතුර වඩා හොඳ / විස්තරාත්මක තීරු ශීර්ෂ භාවිතා කරයි, වගු සැකැස්ම අවධානය වෙනතකට යොමු නොකරයි, එයට ලේඛනයට සෘජු සම්බන්ධතා ඇතුළත් වන අතර මම තීරුවක් එක් කළෙමි (එනම් 'ගොනු වස්තුව පිළිගනී').
maxschlepzig

4
හරි. වයි.
wim

104

පයිතන්හිදී, ඔබට ගොනු භාවිතයෙන් පිටපත් කළ හැකිය

  • shutil මොඩියුලය
  • os මොඩියුලය
  • subprocess මොඩියුලය

import os
import shutil
import subprocess

1) shutilමොඩියුලය භාවිතයෙන් ගොනු පිටපත් කිරීම

shutil.copyfile අත්සන

shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)

# example    
shutil.copyfile('source.txt', 'destination.txt')

shutil.copy අත්සන

shutil.copy(src_file, dest_file, *, follow_symlinks=True)

# example
shutil.copy('source.txt', 'destination.txt')

shutil.copy2 අත්සන

shutil.copy2(src_file, dest_file, *, follow_symlinks=True)

# example
shutil.copy2('source.txt', 'destination.txt')  

shutil.copyfileobj අත්සන

shutil.copyfileobj(src_file_object, dest_file_object[, length])

# example
file_src = 'source.txt'  
f_src = open(file_src, 'rb')

file_dest = 'destination.txt'  
f_dest = open(file_dest, 'wb')

shutil.copyfileobj(f_src, f_dest)  

2) osමොඩියුලය භාවිතයෙන් ගොනු පිටපත් කිරීම

os.popen අත්සන

os.popen(cmd[, mode[, bufsize]])

# example
# In Unix/Linux
os.popen('cp source.txt destination.txt') 

# In Windows
os.popen('copy source.txt destination.txt')

os.system අත්සන

os.system(command)


# In Linux/Unix
os.system('cp source.txt destination.txt')  

# In Windows
os.system('copy source.txt destination.txt')

3) subprocessමොඩියුලය භාවිතයෙන් ගොනු පිටපත් කිරීම

subprocess.call අත්සන

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

# example (WARNING: setting `shell=True` might be a security-risk)
# In Linux/Unix
status = subprocess.call('cp source.txt destination.txt', shell=True) 

# In Windows
status = subprocess.call('copy source.txt destination.txt', shell=True)

subprocess.check_output අත්සන

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)

# example (WARNING: setting `shell=True` might be a security-risk)
# In Linux/Unix
status = subprocess.check_output('cp source.txt destination.txt', shell=True)

# In Windows
status = subprocess.check_output('copy source.txt destination.txt', shell=True)


9
තනි වචන විධාන භාවිතා කිරීම නරක කේතීකරණ විලාසය (නම්යශීලීභාවය, විශ්වසනීයත්වය සහ ආරක්ෂාව), ඒ වෙනුවට ['copy', sourcefile, destfile]හැකි සෑම තැනකම සින්ටැක්ස් භාවිතා කරන්න , විශේෂයෙන් පරාමිතීන් පරිශීලක ආදානයෙන් නම්.
මාසෙල් වෝල්ඩ්වොගල්

8
ෂටල් පිටපත් කාර්යයන් සඳහා ඔබ එතරම් නරක විකල්ප ලැයිස්තුගත කරන්නේ ඇයි?
maxschlepzig

6
shutil ගොඩනගා ඇත, අතේ ගෙන යා නොහැකි විකල්ප සැපයීමට අවශ්‍ය නැත. පද්ධතිය මත යැපෙන විසඳුම් ඉවත් කිරීමෙන් පිළිතුර සැබවින්ම වැඩිදියුණු කළ හැකි අතර, එම ඉවත් කිරීමෙන් පසුව, මෙම පිළිතුර දැනට පවතින පිළිතුරු වල පිටපතක් / ප්‍රලේඛනයේ පිටපතක් පමණි.
ජීන්-ප්‍රංශුවා ෆැබ්රේ

3
os.popenදැන් ටික කලක් ඉවත් කර ඇත. සහ check_outputතත්වය ආපසු නොදෙන නමුත් ප්‍රතිදානය (එය හිස්ව පවතී copy/cp)
ජීන්-ප්‍රංශුවා ෆැබ්‍රේ

2
shutil ඇත්ත වශයෙන්ම ගොනු පිටපත් නොකරයි. තියෙනවා මේ ලේඛන මුදුනේ විශාල මේදය අනතුරු ඇඟවීමක් අයිතිය . "මෙයින් අදහස් කරන්නේ ගොනු හිමිකරු සහ කණ්ඩායම මෙන්ම ACL ද නැති වී ඇති බවයි. මැක් ඕඑස් හි සම්පත් දෙබලක සහ වෙනත් පාර-දත්ත භාවිතා නොකෙරේ. මෙයින් අදහස් කරන්නේ සම්පත් නැති වී යන අතර ගොනු වර්ගය සහ නිර්මාණ කේත නිවැරදි නොවන බවයි. වින්ඩෝස් හි, ගොනු හිමිකරුවන්, ACLs සහ විකල්ප දත්ත ප්‍රවාහයන් පිටපත් නොකෙරේ.
gman

96

පහත උදාහරණ වලින් දැක්වෙන පරිදි ගොනුවක් පිටපත් කිරීම සාපේක්ෂව සරල මෙහෙයුමකි, නමුත් ඒ වෙනුවට ඔබ ඒ සඳහා shutil stdlib මොඩියුලය භාවිතා කළ යුතුය .

def copyfileobj_example(source, dest, buffer_size=1024*1024):
    """      
    Copy a file from source to dest. source and dest
    must be file-like objects, i.e. any object with a read or
    write method, like for example StringIO.
    """
    while True:
        copy_buffer = source.read(buffer_size)
        if not copy_buffer:
            break
        dest.write(copy_buffer)

ඔබට ගොනු නාමයෙන් පිටපත් කිරීමට අවශ්‍ය නම් ඔබට මෙවැනි දෙයක් කළ හැකිය:

def copyfile_example(source, dest):
    # Beware, this example does not handle any edge cases!
    with open(source, 'rb') as src, open(dest, 'wb') as dst:
        copyfileobj_example(src, dst)

25
මම මොඩියුලය shutil (ඒක වචන) නොව shutils (බහු වචන) ලෙස හැඳින්වේ බව මොහොතකට පෙර දැක, ඇත්ත වශයෙන්ම එය වේ Python 2.3. එසේ වුවද මම මෙම ශ්‍රිතය උදාහරණයක් ලෙස මෙහි තබමි.
pi.

4
ගොනුවක අන්තර්ගතය පිටපත් කිරීම සරල මෙහෙයුමකි. ගොනුව එහි පාර-දත්ත සමඟ පිටපත් කිරීම අන් කිසිවක් නොව සරල ය, ඊටත් වඩා ඔබට හරස් වේදිකාවක් වීමට අවශ්‍ය නම්.
ලාක්

3
සැබෑ. ෂටිල් ලියකියවිලි දෙස බලන විට, පිටපත් ගොනුවේ ක්‍රියාකාරිත්වය ද පාර-දත්ත පිටපත් නොකරනු ඇත.
pi.

3
ඔව්, ඔබ මූලාශ්‍රය පිටපත් නොකරන්නේ මන්දැයි මට විශ්වාස නැත shutil.copyfileobj. try, finallyව්‍යතිරේකයෙන් පසුව ලිපිගොනු වැසීම හැසිරවීමට ඔබට කිසිවක් නැත . කෙසේ වෙතත්, ලිපිගොනු විවෘත කිරීම සහ වැසීම සඳහා ඔබේ කාර්යය වගකිව යුතු නැති බව මම කියමි. එය කොතරම් මෙන් වූ දවටනය උත්සවයට යා යුතු shutil.copyfileආධාරක shutil.copyfileobj.
අර්ල්වෝල්ටන්

2
ඉහත කේතය destලිවිය හැකි ලෙස සඳහන් කළ යුතුය:open(dest, 'wb')
user1016274

69

ෂටිල් මොඩියුලය භාවිතා කරන්න .

copyfile(src, dst)

Src නම් ගොනුවේ අන්තර්ගතය dst නම් ගොනුවකට පිටපත් කරන්න. ගමනාන්ත ස්ථානය ලිවිය හැකි විය යුතුය; එසේ නොමැති නම්, IOError ව්‍යතිරේකයක් මතු කරනු ඇත. Dst දැනටමත් පවතී නම්, එය ප්රතිස්ථාපනය වේ. අක්ෂර හෝ බ්ලොක් උපාංග සහ පයිප්ප වැනි විශේෂ ලිපිගොනු මෙම ශ්‍රිතය සමඟ පිටපත් කළ නොහැක. src සහ dst යනු නූල් ලෙස ලබා දී ඇති මාර්ග නම් වේ.

දෙස බලන්න filesys සම්මත Python මොඩියුලයන් ලබා ගත කටයුතු භාරව සියලු ගොනු හා බහලුම් සඳහා.


shutil ඇත්ත වශයෙන්ම ගොනු පිටපත් නොකරයි. තියෙනවා මේ ලේඛන මුදුනේ විශාල මේදය අනතුරු ඇඟවීමක් අයිතිය . "මෙයින් අදහස් කරන්නේ ගොනු හිමිකරු සහ කණ්ඩායම මෙන්ම ACL ද නැති වී ඇති බවයි. මැක් ඕඑස් හි සම්පත් දෙබලක සහ වෙනත් පාර-දත්ත භාවිතා නොකෙරේ. මෙයින් අදහස් කරන්නේ සම්පත් නැති වී යන අතර ගොනු වර්ගය සහ නිර්මාණ කේත නිවැරදි නොවන බවයි. වින්ඩෝස් හි, ගොනු හිමිකරුවන්, ACLs සහ විකල්ප දත්ත ප්‍රවාහයන් පිටපත් නොකෙරේ.
gman

47

නාමාවලිය සහ ගොනු පිටපත් උදාහරණය - ටිම් ගෝල්ඩන්ගේ පයිතන් බඩු වලින්:

http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html

import os
import shutil
import tempfile

filename1 = tempfile.mktemp (".txt")
open (filename1, "w").close ()
filename2 = filename1 + ".copy"
print filename1, "=>", filename2

shutil.copy (filename1, filename2)

if os.path.isfile (filename2): print "Success"

dirname1 = tempfile.mktemp (".dir")
os.mkdir (dirname1)
dirname2 = dirname1 + ".copy"
print dirname1, "=>", dirname2

shutil.copytree (dirname1, dirname2)

if os.path.isdir (dirname2): print "Success"

24

පළමුවෙන්ම, මම ඔබේ යොමු කිරීම සඳහා ෂටල් ක්‍රම පිළිබඳ පරිපූර්ණ චෙට්ෂීට් එකක් සාදන ලදී.

shutil_methods =
{'copy':['shutil.copyfileobj',
          'shutil.copyfile',
          'shutil.copymode',
          'shutil.copystat',
          'shutil.copy',
          'shutil.copy2',
          'shutil.copytree',],
 'move':['shutil.rmtree',
         'shutil.move',],
 'exception': ['exception shutil.SameFileError',
                 'exception shutil.Error'],
 'others':['shutil.disk_usage',
             'shutil.chown',
             'shutil.which',
             'shutil.ignore_patterns',]
}

දෙවනුව, පිටපත්වල පිටපත් කිරීමේ ක්‍රම පැහැදිලි කරන්න:

  1. shutil.copyfileobj(fsrc, fdst[, length]) විවෘත වස්තු හැසිරවීම
In [3]: src = '~/Documents/Head+First+SQL.pdf'
In [4]: dst = '~/desktop'
In [5]: shutil.copyfileobj(src, dst)
AttributeError: 'str' object has no attribute 'read'
#copy the file object
In [7]: with open(src, 'rb') as f1,open(os.path.join(dst,'test.pdf'), 'wb') as f2:
    ...:      shutil.copyfileobj(f1, f2)
In [8]: os.stat(os.path.join(dst,'test.pdf'))
Out[8]: os.stat_result(st_mode=33188, st_ino=8598319475, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067347, st_mtime=1516067335, st_ctime=1516067345)
  1. shutil.copyfile(src, dst, *, follow_symlinks=True) පිටපත් කර නැවත නම් කරන්න
In [9]: shutil.copyfile(src, dst)
IsADirectoryError: [Errno 21] Is a directory: ~/desktop'
#so dst should be a filename instead of a directory name
  1. shutil.copy() පාර-දත්ත පූර්වයෙන් තොරව පිටපත් කරන්න
In [10]: shutil.copy(src, dst)
Out[10]: ~/desktop/Head+First+SQL.pdf'
#check their metadata
In [25]: os.stat(src)
Out[25]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066425, st_mtime=1493698739, st_ctime=1514871215)
In [26]: os.stat(os.path.join(dst, 'Head+First+SQL.pdf'))
Out[26]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066427, st_mtime=1516066425, st_ctime=1516066425)
# st_atime,st_mtime,st_ctime changed
  1. shutil.copy2() පාර-දත්ත පූර්වයෙන් පිටපත් කරන්න
In [30]: shutil.copy2(src, dst)
Out[30]: ~/desktop/Head+First+SQL.pdf'
In [31]: os.stat(src)
Out[31]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067055, st_mtime=1493698739, st_ctime=1514871215)
In [32]: os.stat(os.path.join(dst, 'Head+First+SQL.pdf'))
Out[32]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067063, st_mtime=1493698739, st_ctime=1516067055)
# Preseved st_mtime
  1. shutil.copytree()

ගමනාන්ත නාමාවලිය නැවත ලබා දෙමින් src හි මුල් බැස ඇති සම්පූර්ණ නාමාවලි ගසක් පුනරාවර්තනය කරන්න


1
shutil ඇත්ත වශයෙන්ම ගොනු පිටපත් නොකරයි. තියෙනවා මේ ලේඛන මුදුනේ විශාල මේදය අනතුරු ඇඟවීමක් අයිතිය . "මෙයින් අදහස් කරන්නේ ගොනු හිමිකරු සහ කණ්ඩායම මෙන්ම ACL ද නැති වී ඇති බවයි. මැක් ඕඑස් හි සම්පත් දෙබලක සහ වෙනත් පාර-දත්ත භාවිතා නොකෙරේ. මෙයින් අදහස් කරන්නේ සම්පත් නැති වී යන අතර ගොනු වර්ගය සහ නිර්මාණ කේත නිවැරදි නොවන බවයි. වින්ඩෝස් හි, ගොනු හිමිකරුවන්, ACLs සහ විකල්ප දත්ත ප්‍රවාහයන් පිටපත් නොකෙරේ.
gman

20

කුඩා ලිපිගොනු සඳහා සහ පයිතන් බිල්ට්-ඉන් පමණක් භාවිතා කිරීම සඳහා, ඔබට පහත එක් ලයිනර් භාවිතා කළ හැකිය:

with open(source, 'rb') as src, open(dest, 'wb') as dst: dst.write(src.read())

පහත දැක්වෙන අදහස් දැක්වීමේදී @maxschlepzig සඳහන් කර ඇති පරිදි, ගොනුව ඉතා විශාල හෝ මතකය තීරණාත්මක වන යෙදුම් සඳහා මෙය ප්‍රශස්ත ක්‍රමයක් නොවේ, එබැවින් ස්වාතිගේ පිළිතුර වඩාත් කැමති විය යුතුය.


3
මෙය සම්පූර්ණ මූලාශ්‍ර ගොනුව නැවත ලිවීමට පෙර මතකයට කියවයි. මේ අනුව, මෙය කුඩාම ගොනු පිටපත් මෙහෙයුම් හැර අන් සියල්ලන්ටම අනවශ්‍ය ලෙස මතකය නාස්ති කරයි.
maxschlepzig

1
ඒක ඇත්තක්ද? මම හිතන්නේ .read()හා .write()පෙරනිමි (අවම වශයෙන් CPython සඳහා) විසින් buffered ඇත.
ශබ්ද පටිය

oundsoundstripe, ඇත්ත වශයෙන්ම මෙය සත්‍යයකි. ගොනු වස්තුව ආපසු ලබා open()දීමෙන් පෙරනිමියෙන් ඔබට මෙහි උදව් නොකෙරේ, මන්ද යත්, read()'n negative ණ හෝ අතහැර දමා ඇත්නම්, ඊඕඑෆ් තෙක් කියවන්න.' ඒ කියන්නේ read()සම්පූර්ණ ගොනු අන්තර්ගතය නූලක් ලෙස ලබා දෙයි.
maxschlepzig

xmaxschlepzig මට ඔබේ අදහස වැටහී ඇති අතර මම පිළිගන්නවා මම ඒ ගැන නොදැන සිටි බව. මා මෙම පිළිතුර ලබා දීමට හේතුව, මොඩියුලයක් ආනයනය කිරීමකින් තොරව, ගොඩනඟන ලද ඒවා පමණක් භාවිතා කරමින් සරල ගොනු පිටපතක් කිරීමට යමෙකුට අවශ්‍ය නම්. ඔබට මෙම විකල්පය අවශ්‍ය නම් මතක ප්‍රශස්තකරණය සැලකිලිමත් නොවිය යුතුය. එය ඉවත් කිරීම ගැන කෙසේ හෝ ඔබට ස්තූතියි. මම ඒ අනුව පිළිතුර යාවත්කාලීන කළෙමි.
yellow01

14

ඔබට භාවිතා කළ හැකිය os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')

නැත්නම් මම ඒක කළා වගේ,

os.system('cp '+ rawfile + ' rawdata.dat')

rawfileවැඩසටහන තුළ මා ජනනය කළ නම කොහිද ?

මෙය ලිනක්ස් පමණක් විසඳුමකි


10
මෙය අතේ ගෙන යා නොහැකි අතර ඔබට ෂටිල් භාවිතා කළ හැකි බැවින් අනවශ්‍යය.
කොරී ගෝල්ඩ්බර්ග්

4
shutilලබා ගත නොහැකි විට පවා - subprocess.run() (නොමැතිව shell=True!) වඩා හොඳ විකල්පයයි os.system().
maxschlepzig

1
shutil වඩා අතේ ගෙන යා හැකි ය
Hiadore

1
subprocess.run()@maxschlepzig විසින් යෝජනා කර ඇති පරිදි බාහිර වැඩසටහන් ඇමතීමේදී විශාල ඉදිරි පියවරකි. කෙසේ වෙතත් නම්යශීලීභාවය සහ ආරක්ෂාව ['cp', rawfile, 'rawdata.dat']සඳහා විධාන රේඛාව පසු කිරීමේ ස්වරූපය භාවිතා කරන්න . (කෙසේ වෙතත්, පිටපත් කිරීම සඳහා shutilසහ මිතුරන් බාහිර වැඩසටහනක් ඇමතීමට නිර්දේශ කරනු ලැබේ.)
මාසෙල් වෝල්ඩ්වොගල්

2
ලිපිගොනු සමඟ එහි ඇති අවකාශයන් සමඟ එය උත්සාහ කරන්න.
ජීන්-ප්‍රංශුවා ෆැබ්රේ

11

විශාල ලිපිගොනු සඳහා, මා කළේ ගොනු රේඛාව රේඛාවෙන් කියවා එක් එක් පේළිය අරාවකට කියවීමයි. පසුව, අරාව යම් ප්‍රමාණයකට ළඟා වූ පසු, එය නව ගොනුවකට එකතු කරන්න.

for line in open("file.txt", "r"):
    list.append(line)
    if len(list) == 1000000: 
        output.writelines(list)
        del list[:]

2
ලේඛකයා බෆරින් හැසිරවිය යුතු බැවින් මෙය ටිකක් අතිරික්තයක් ලෙස පෙනේ. for l in open('file.txt','r'): output.write(l)සොයා ගත යුතු වැඩ; ඔබගේ අවශ්‍යතාවන්ට ප්‍රතිදාන ප්‍රවාහ බෆරය සකසන්න. හෝ වරකට ඔබ ලිවීමට කැමති බයිට් ගණන output.write(read(n)); output.flush()කොහේදැයි උත්සාහ කර බැලීමෙන් ඔබට බයිට් වලින් යා හැකිය n. මේ දෙකටම ප්‍රසාද දීමනාවක් දැයි පරීක්ෂා කිරීමට කොන්දේසියක් නොමැත.
හිමි

1
ඔව්, නමුත් සමහර විට මෙය තේරුම් ගැනීමට පහසු වනු ඇතැයි මම සිතුවෙමි, මන්ද එය කොටස් වලට වඩා සම්පූර්ණ රේඛා පිටපත් කරන බැවිනි (එක් එක් පේළියේ බයිට් කීයක් දැයි අප නොදන්නේ නම්).
ytpillai

ඉතා ඇත්ත. ඉගැන්වීම සඳහා කේතීකරණය සහ කාර්යක්ෂමතාව සඳහා කේතනය කිරීම බෙහෙවින් වෙනස් ය.
හිමි

1
මූලාශ්‍රය දෙස බැලීම - ලිවීම් ඇමතුම් ලිවීම, hg.python.org/cpython/file/c6880edaf6f3/Modules/_io/bytesio.c . එසේම, ගොනු ප්‍රවාහය දැනටමත් විවෘතව ඇත, එබැවින් ලිවීමට සෑම විටම එය නැවත විවෘත කිරීමට අවශ්‍ය නොවේ.
හිමි

2
මෙය භයානක ය. එය කිසිදු හේතුවක් නොමැතිව අනවශ්‍ය වැඩ කරයි. අත්තනෝමතික ලිපිගොනු සඳහා එය ක්‍රියා නොකරයි. වින්ඩෝස් වැනි පද්ධති වල ආදාන අසාමාන්‍ය රේඛා අවසානයක් තිබේ නම් පිටපත බයිට්-සමාන නොවේ. පිටපත් ශ්‍රිතයක් සඳහා වන ඇමතුමකට වඩා මෙය තේරුම් ගැනීම පහසු යැයි ඔබ සිතන්නේ ඇයි shutil? නොසලකා හරින විට පවා shutil, සරල බ්ලොක් කියවීමේ / ලිවීමේ ලූපයක් (නොකැඩූ IO භාවිතා කිරීම) කෙළින්ම ඉදිරියට යනු ඇත, කාර්යක්ෂම වන අතර මෙයට වඩා බොහෝ අර්ථවත් වනු ඇත, එබැවින් ඉගැන්වීමට සහ තේරුම් ගැනීමට පහසුය.
maxschlepzig

11
from subprocess import call
call("cp -p <file> <file>", shell=True)

10
මෙය වේදිකාව මත රඳා පවතී, එබැවින් මම භාවිතා නොකරමි.
කෙවින් මේයර්

5
එවැනි callඅනාරක්ෂිත ය. කරුණාකර ඒ පිළිබඳ උපප්‍රස්ථාර ලේඛනය වෙත යොමු වන්න.
buhtz

2
මෙය අතේ ගෙන යා නොහැකි අතර ඔබට ෂටිල් භාවිතා කළ හැකි බැවින් අනවශ්‍යය.
කොරී ගෝල්ඩ්බර්ග්

2
හ්ම් ඇයි පයිතන්, එහෙනම්?
බැරිස් ඩෙමිරේ

සමහර විට මෙහෙයුම් පද්ධතිය ආරම්භ කිරීමට පෙර හඳුනා ගන්න (එය ඩොස් හෝ යුනික්ස් වේවා, මන්ද ඒවා වැඩිපුරම භාවිතා වන්නේ දෙකයි)
මිල්කිවේ 90

8

වන විට පිඹුරා 3.5 ඔබ පහත සඳහන් කරන්න පුළුවන් කුඩා ගොනු (එනම්: පෙළ ගොනු, කුඩා jpegs) සඳහා:

from pathlib import Path

source = Path('../path/to/my/file.txt')
destination = Path('../path/where/i/want/to/store/it.txt')
destination.write_bytes(source.read_bytes())

write_bytes ගමනාන්තයේ පිහිටි ඕනෑම දෙයක් නැවත ලියයි


2
එවිට යමෙක් විශාල ගොනුවක කේතය (අහම්බෙන් හෝ අරමුණක් ඇතිව) භාවිතා කරයි… කාර්යයන් භාවිතා කිරීමෙන් shutilඔබ වෙනුවෙන් සියලුම විශේෂ අවස්ථා හසුරුවන අතර ඔබට මනසේ සාමය ලැබේ.
මාසෙල් වෝල්ඩ්වොගල්

5
අවම වශයෙන් එය එකම විසඳුම් නැවත නැවතත් නොකෙරේ.
ජීන්-ප්‍රංශුවා ෆැබ්රේ

6
open(destination, 'wb').write(open(source, 'rb').read())

ප්‍රභව ගොනුව කියවීමේ ප්‍රකාරයේදී විවෘත කර ගමනාන්ත ගොනුවට ලිවීමේ ක්‍රමයට ලියන්න.


1
අදහස හොඳයි, කේතය ලස්සනයි, නමුත් නිසි පිටපත් () ශ්‍රිතයකට ගුණාංග පිටපත් කිරීම (+ x බිට්) වැනි තවත් බොහෝ දේ කළ හැකිය, හෝ උදාහරණයක් ලෙස තැටියක් පිරී ඇති තත්වයක් හමු වුවහොත් දැනටමත් පිටපත් කළ බයිට් මකා දැමීම. .
රාවුල් සාලිනාස්-මොන්ටෙගුඩෝ

1
සියලු පිළිතුරු එක් වාක්‍යයක් වුවද පැහැදිලි කිරීම අවශ්‍ය වේ. කිසිදු පැහැදිලි කිරීමක් නරක පූර්වාදර්ශයක් සපයන අතර වැඩසටහන තේරුම් ගැනීමට උපකාරී නොවේ. සම්පූර්ණ පයිතන් නොබ් එකක් පැමිණ මෙය දුටු විට, එය භාවිතා කිරීමට අවශ්‍ය නම්, නමුත් ඔවුන්ට එය නොතේරෙන නිසා කුමක් කළ හැකිද? ඔබගේ පිළිතුරු වලින් සැමට උදව් කිරීමට ඔබට අවශ්‍යය.
connectyourcharger

1
.close()හැම දෙයක්ම නැතිවෙලා open(...)නේද?
luckdonald

.Close () අවශ්‍ය නොවේ, අප ගොනු දර්ශක වස්තුව කොතැනකවත් ගබඩා නොකරන බැවින් (src ගොනුව සඳහා හෝ ගමනාන්ත ගොනුව සඳහා නොවේ).
එස් 471

1
කහ 01 හි පිළිතුර ලෙස එකම උප- ප්‍රශස්ත මතකය නාස්ති කිරීමේ ප්‍රවේශය .
maxschlepzig

-3

මෙහෙයුම් පද්ධති ෂෙල් උපයෝගීතා භාවිතයෙන් ලිපිගොනු පහසුවෙන් පිටපත් කිරීම සඳහා පයිතන් තුළ ඇති කාර්යයන් සපයයි.

ගොනුව පිටපත් කිරීමට පහත විධානය භාවිතා කරයි

shutil.copy(src,dst)

මෙටා ඩේටා තොරතුරු සමඟ ගොනුව පිටපත් කිරීමට පහත විධානය භාවිතා කරයි

shutil.copystat(src,dst)

ගොනු පාර-දත්ත සුරැකීමට ඔබ copyපසුව ධාවනය කළ යුතුය copystat. පයිතන් 3.3+ හි දීර් copystatextended කරන ලද ගුණාංග ද පිටපත් කරයි.
ingyhere
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.