❶ python怎麼判斷文件是否存在
正文
通常在讀寫文件之前,需要判斷文件或目錄是否存在,不然某些處理方法可能會使程序出錯。所以最好在做任何操作之前,先判斷文件是否存在。
這里將介紹三種判斷文件或文件夾是否存在的方法,分別使用os模塊、Try語句、pathlib模塊。
回到頂部
1.使用os模塊
os模塊中的os.path.exists()方法用於檢驗文件是否存在。
判斷文件是否存在
判斷文件夾是否存在
可以看出用os.path.exists()方法,判斷文件和文件夾是一樣。
其實這種方法還是有個問題,假設你想檢查文件「test_data」是否存在,但是當前路徑下有個叫「test_data」的文件夾,這樣就可能出現誤判。為了避免這樣的情況,可以這樣:
只檢查文件
import os通過這個方法,如果文件」test-data」不存在將返回False,反之返回True。
即是文件存在,你可能還需要判斷文件是否可進行讀寫操作。
回到頂部
判斷文件是否可做讀寫操作
使用os.access()方法判斷文件是否可進行讀寫操作。
語法:
os.access(path, mode)
path為文件路徑,mode為操作模式,有這么幾種:
os.F_OK: 檢查文件是否存在;
os.R_OK: 檢查文件是否可讀;
os.W_OK: 檢查文件是否可以寫入;
os.X_OK: 檢查文件是否可以執行
該方法通過判斷文件路徑是否存在和各種訪問模式的許可權返回True或者False。
回到頂部
2.使用Try語句
可以在程序中直接使用open()方法來檢查文件是否存在和可讀寫。
語法:
open()
如果你open的文件不存在,程序會拋出錯誤,使用try語句來捕獲這個錯誤。
程序無法訪問文件,可能有很多原因:
如果你open的文件不存在,將拋出一個FileNotFoundError的異常;
文件存在,但是沒有許可權訪問,會拋出一個PersmissionError的異常。
所以可以使用下面的代碼來判斷文件是否存在:
其實沒有必要去這么細致的處理每個異常,上面的這兩個異常都是IOError的子類。所以可以將程序簡化一下:
使用try語句進行判斷,處理所有異常非常簡單和優雅的。而且相比其他不需要引入其他外部模塊。
回到頂部
3. 使用pathlib模塊
pathlib模塊在Python3版本中是內建模塊,但是在Python2中是需要單獨安裝三方模塊。
使用pathlib需要先使用文件路徑來創建path對象。此路徑可以是文件名或目錄路徑。
檢查路徑是否存在
檢查路徑是否是文件
❷ 怎麼判斷 Python 對象是否包含某個屬性
方法一:通過異常捕捉來實現邏輯
classFooClass:
pass
k=FooClass()
try:
#dosomethingyouneed
printk.att
exceptAttributeErrorase:
#error:hasnotattribute
pass
方法二:調用hasattr方法
hasattr(object, name)
說明:判斷對象object是否包含名為name的特性(hasattr是通過調用getattr(ojbect, name)是否拋出異常來實現的)。
參數object:對象。
參數name:特性名稱。
>>> hasattr(list, 'append')
True
>>> hasattr(list, 'add')
False
方法三:使用dir方法
objlist = dir(k)
if 'att' in objlist:
#do some thing you need
print k.att
else:
#error: has not attribute
pass
❸ 怎樣在python中判斷一個文件是否存在
你可以用os.path.isfile
如果路徑下是現有普通文件返回true。因此islink()和isflie()都可以來判斷相同目錄下是否有文件。
import os.path
os.path.isfile(fname)
在Python3.4之後pathlib模塊提供了一種面向對象的方法用於判斷文件是否存在:
from pathlib import Path
my_file = Path("/path/to/file")
if my_file.is_file():
# file exists
❹ python 怎麼判斷某個對象是否在列表中出現過
通過異常捕捉來實現邏輯
class FooClass:
pass
k = FooClass()
try:
#do some thing you need
print k.att
except AttributeError as e:
#error: has not attribute
pass
❺ Python之運算符匯總
1.算數運算符
假設 a= 10, b = 20
2.比較運算符
相關推薦:《Python視頻教程》
3.賦值運算符
4.邏輯運算符
邏輯運算的順序排列:從左往右開始執行
() > not > and > or
and or 一真一假
都為真: 取後面的 取前面的 取假的
都為假: 取前面的 去後面的 取真的
not True: False
not False: True
5.成員運算符
in -- 存在
not in -- 不存在
❻ python怎麼判斷一個對象的屬性
方法一:通過異常捕捉來實現邏輯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class FooClass:
pass
k = FooClass()
try:
#do some thing you need
print k.att
except AttributeError as e:
#error: has not attribute
pass
方法二:調用hasattr方法
hasattr(object, name)
說明:判斷對象object是否包含名為name的特性(hasattr是通過調用getattr(ojbect, name)是否拋出異常來實現的)。
參數object:對象。
參數name:特性名稱。
>>> hasattr(list, 'append')
True
>>> hasattr(list, 'add')
False
方法三:使用dir方法
objlist = dir(k)
if 'att' in objlist:
#do some thing you need
print k.att
else:
#error: has not attribute
pass
❼ python threading local 判斷值存不存在
#coding=utf-8
import threading
# 創建全局ThreadLocal對象:
localVal = threading.local()
localVal.val = "Main-Thread"
def process_student():
print '%s (in %s)' % (localVal.val, threading.current_thread().name)
def process_thread(name):
#賦值
localVal.val = name
process_student()
t1 = threading.Thread(target= process_thread, args=('One',), name='Thread-A')
t2 = threading.Thread(target= process_thread, args=('Two',), name='Thread-B')
t1.start()
t2.start()
t1.join()
t2.join()
print localVal.val
列印結果:
One (in Thread-A)
Two (in Thread-B)
Main-Thread
threading.local()這個方法的特點用來保存一個全局變數,但是這個全局變數只有在當前線程才能訪問,
localVal.val = name這條語句可以儲存一個變數到當前線程,如果在另外一個線程裡面再次對localVal.val進行賦值,
那麼會在另外一個線程單獨創建內存空間來存儲,也就是說在不同的線程裡面賦值 不會覆蓋之前的值,因為每個
線程裡面都有一個單獨的空間來保存這個數據,而且這個數據是隔離的,其他線程無法訪問
這個東西可以用在那些地方呢,比如下載,現在都是多線程下載了,就像酷狗那樣,可以同時下載很多首歌曲,那麼
就可以利用這個方法來保存每個下載線程的數據,比如下載進度,下載速度之類的
所以 如果你在開發多線程應用的時候 需要每個線程保存一個單獨的數據供當前線程操作,可以考慮使用這個方法,簡單有效
其實這樣的功能還有很多種方法可以實現,比如我們在主線程實例化一個dict對象,然後用線程的名字作為key,因為線程之間可以共享數據,
所以也可以實現相同功能,並且靈活性更多,不過代碼就沒那麼優雅簡潔了
❽ 用Python寫入文件,若該行數據存在則不寫入;若不存在,則寫入。怎麼才能在寫入之前判斷該數據是否存在
用open,該函數創建一個文件對象,這將用來調用與之關聯的其他支持方式即可:
file object = open(file_name [, access_mode][, buffering])
file_name: file_name參數是一個字元串值,包含要訪問的文件的名稱。
access_mode: access_mode決定了文件必須被打開,即,讀,寫,追加等的可能值是下表中給定的一個完整的列表的模式。這是可選參數,默認文件存取方式為read (r)。
(8)python判斷對象是否存在擴展閱讀:
file命令的函數意義:
file 命令讀取用 File 參數或者 FileList 變數指定的文件,在每個文件上執行一系列測試,然後將它們按照類型分類。然後此命令將文件類型寫入標准輸出。文件可以是常規文件、目錄、FIFO(指定的管道)、塊特殊文件、字元特別文件、符號鏈接或者套接字類型。
1、對於長度為零的常規文件,將識別為空文件。
2、對於符號鏈接文件,預設情況下此鏈接後跟符號鏈接引用的文件。
如果文件是 ASCII 碼的格式,則 file 命令將檢查前 1024 個位元組然後確定文件類型。如果文件不是 ASCII 格式,則 file 命令將嘗試區分二進制數據文件和包含擴展字元的文本文件。
❾ python實現mysql插入數據時,判斷是否存在,不存在就插入,重復跳過
方案一:使用ignore關鍵字
如果是用主鍵primary或者唯一索引unique區分了記錄的唯一性,避免重復插入記錄可以使用:
insert ignore into table_name(email,phone,user_id) values('[email protected]','99999','9999'),這樣當有重復記
錄就會忽略,執行後返回數字0,還有個應用就是復製表,避免重復記錄:
insert ignore into table(name) select name from table2
方案二:使用Replace
replace的語法格式為:
1. replace into table_name(col_name, ...) values(...)
2. replace into table_name(col_name, ...) select ...
3. replace into table_name set col_name=value, ...
演算法說明:
REPLACE的運行與INSERT很相像,但是如果舊記錄與新記錄有相同的值,則在新記錄被插入之前,舊記錄被刪除,即:
1. 嘗試把新行插入到表中
2. 當因為對於主鍵或唯一關鍵字出現重復關鍵字錯誤而造成插入失敗時:
從表中刪除含有重復關鍵字值的沖突行
再次嘗試把新行插入到表中
舊記錄與新記錄有相同的值的判斷標准就是:表有一個PRIMARY KEY或UNIQUE索引,否則,使用一個REPLACE語句沒有意義
。該語句會與INSERT相同,因為沒有索引被用於確定是否新行復制了其它的行。
返回值:
REPLACE語句會返回一個數,來指示受影響的行的數目。該數是被刪除和被插入的行數的和。
受影響的行數可以容易地確定是否REPLACE只添加了一行,或者是否REPLACE也替換了其它行:檢查該數是否為1(添加)或
更大(替換)。
示例:
eg:(phone欄位為唯一索引)
replace into table_name(email,phone,user_id) values('test569','99999','123')
另外:在 SQL Server 中可以這樣處理:
if not exists (select phone from t where phone= '1')
insert into t(phone, update_time) values('1', getdate())
else
update t set update_time = getdate() where phone= '1'
更多信息請看:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#replace
方案三:ON DUPLICATE KEY UPDATE
如上所寫,你也可以在INSERT INTO.....後面加上 ON DUPLICATE KEY UPDATE方法來實現。
如果您指定了ON DUPLICATE KEY UPDATE,並且插入行後會導致在一個UNIQUE索引
或PRIMARY KEY中出現重復值,
則執行舊行UPDATE。例如,如果列a被定義為UNIQUE,並且包含值1,則以下兩個語句具有相
同的效果:
mysql>INSERT INTO table (a,b,c) VALUES (1,2,3)
->ON DUPLICATE KEY UPDATE c=c+1;
mysql>UPDATE table SET c=c+1 WHERE a=1;
如果行作為新記錄被插入,則受影響行的值為1;如果原有的記錄被更新,則受影響行的值為2。
注釋:如果列b也是唯一列,則INSERT與此UPDATE語句相當:
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
如果a=1 OR b=2與多個行向匹配,則只有一個行被更新。通常,您應該盡量避免對帶有多個唯一關鍵字的表使用ON DUPLICATE KEY子句。
您可以在UPDATE子句中使用VALUES(col_name)函數從INSERT...UPDATE語句的INSERT部分引用列值。
換句話說,如果沒有發生重復關鍵字沖突,則UPDATE子句中的VALUES(col_name)可以引用被插入的
col_name的值。本函數特別適用於多行插入。VALUES()函數只在INSERT...UPDATE語句中有意義,其它時候
會返回NULL。
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
-> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
本語句與以下兩個語句作用相同:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=3;
mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)
-> ON DUPLICATE KEY UPDATE c=9;
當您使用ON DUPLICATE KEY UPDATE時,DELAYED選項被忽略。
示例: 這個例子是我在實際項目中用到的:是將一個表的數據導入到另外一個表中,數據的重復性就得考慮(如下)。
唯一索引為:email
INSERT INTO table_name1(title,first_name,last_name,email,phone,user_id,role_id,status,campaign_id)
SELECT '','','',table_name2.email,table_name2.phone,NULL,NULL,'pending',29
FROM table_name2
WHERE table_name2.status = 1
ON DUPLICATE KEY UPDATE table_name1.status = 'pending'
語句的關鍵地方,都已高亮出來~
再貼一個例子:
insert into class select * from class1
ON DUPLICATE KEY UPDATE class.course = class1.course
其它關鍵:DELAYED 做為快速插入,並不是很關心失效性,提高插入性能。
IGNORE 只關注主鍵對應記錄是不存在,無則添加,有則忽略。
特別說明:在MYSQL中UNIQUE 索引將會對null欄位失效,也就是說(a欄位上建立唯一索引):
insert into test(a) values(null)
insert into test(a) values(null)
是可以重復插入的(聯合唯一索引也一樣)。