Skip to main content
 首页 » 编程设计

python之打开网络位置

2025年05月04日8over140

我正在尝试从网络位置打开 .csv 文件并遇到以下错误..我有以下问题

1.如何在windows中打开网络位置

2.如何在windows和linux中打开同一个网络位置?

import csv 
import datetime 
from collections import deque 
#from collections import maxlength 
 
icount=9 
now = datetime.datetime.now() 
time =now.strftime("%m/%d/%Y") 
#Keep appending date and count everytime this script is run 
c = csv.writer(open("\\data\loc\\scripts\trend.csv", "ab")) 
c.writerow([time, icount-1]) 
 
#Now read the recent 5 entries and print 
#cr = csv.reader(open("trend.csv","rb")) 
 
 
with open('trend.csv','rU') as fin: 
    reader=csv.reader(fin) 
    d=deque(reader,8) 
for l in d: 
    print l[0] 
    print l[1] 

错误:-

Traceback (most recent call last): 
  File "database.py", line 10, in <module> 
    c = csv.writer(open("\\data\loc\scripts\trend.csv", "ab")) 
IOError: [Errno 2] No such file or directory: '\\data\loc\\scripts\trend.csv' 

请您参考如下方法:

你的第一个问题在这里:

c = csv.writer(open("\\data\loc\\scripts\trend.csv", "ab")) 

因为您没有转义反斜杠,所以 \t 变成了一个制表符,每个 \\ 变成了一个反斜杠,而 \l 你很幸运,它没有改变。所以,这就是您要求的路径:

\data\loc\scripts   rend.csv 

显然那里什么都没有。

始终对 Windows 路径使用原始字符串,这样您就不会遇到这个问题。

c = csv.writer(open(r"\\data\loc\\scripts\trend.csv", "ab")) 

假设有一个名为 data 的 SMB 服务器和一个名为 loc 的共享,并且您已经登录,现在这将起作用。

您仍然应该去掉 scripts 之前的额外反斜杠,并始终关闭您打开的文件……但这些都不会导致您的问题。


在 Linux 中,您无法像这样使用 UNC 路径访问 SMB 共享。

有两种常见的解决方法。

首先,您可以将 SMB 共享挂载到文件系统的某个位置。如果你已经将 smb://data/loc 挂载到 /mnt/data-loc,你只需要这样写:

c = csv.writer(open(r"/mnt/data-loc/scripts/trend.csv", "ab")) 

或者,您可以直接访问 SMB,有点像处理 FTP 服务器。如果你search PyPI ,您会找到各种 Python 库来简化此操作。它们中的许多都需要 libsmbclient 库、smbclient 工具或您可能没有安装的其他东西,因此请务必阅读要求。以下是使用其中一个库的方法:

import smbclient 
 
smb = smbclient.SambaClient(server='DATA', share='LOC', domain='WORKGROUP', 
                            username='me', password='swordfish') 
smb.chdir('scripts') 
with smb.open('trend.csv', 'rb') as f: 
    data = f.read() 
sio = StringIO.StringIO(data) 
c = csv.writer(sio) 
c.writerow([time, icount-1]) 
with smb.open('trend.csv', 'wb') as f: 
    f.write(sio.getvalue()) 
smb.close()