Indian top order, except captain Rahul Dravid (79) and Mohammed Kaif (30), came as croppers and failed to reach double digits. Irfan Pathan was the second highest scorer with 34 and Zaheer Khan chipped in 13 runs.
Only a face-saving seventh-wicket stand of 84 between Dravid and Pathan saved India from humiliation as they slid to 82 for 6 at one stage in reply to the home side's 255 for eight in the day-night match.
Fast bowler Dale Steyn was the wrecker-in-chief climimg five wickets. In his first spell he removed Sachin Tendulkar and Wasim Jaffer, in his second he dimissed Dhoni and Suresh Raina in three balls, and he returned later on to end Dravid's impressively defiant knock of 79 with his first ball.
The visitors received an early jolt when Sachin Tendulkar (5) was removed by Dale Steyn and two runs later, the pacer came back to claim the wicket of another Mumbaikar, Wasim Jaffar, whose contribution was also five. India thus had both their openers cooling their heels in the pavilion at the team score of 12 at the end of four overs.
India suffered a setback before the match started as opener Virender Sehwag was ruled out with a finger injury which he suffered during the practice and the Delhi opener looks doubtful for the first ODI which starts on Sunday.
Earlier, after captain Ashwell Prince opted to bat first, Jacques Rudolph's violent unbeaten 53-ball knock of 72 and Albie Morkels brisk 57 propped up the local side, which scored 255 for eight wickets in their stipulated 50 overs.
After Munaf Patel had removed opener Morne van Wyk (7) to draw first blood, comeback man Zaheer Khan's two-wicket burst, including that of Hashim Amla (11), put the local favourites on back foot but Neil McKenzie (47) and Ashwell Prince (31) built the foundation before Rudolph and Morkel sent the Indian bowlers on a leather hunt.
Rudolph took just 53 balls to score 72, which included seven hits to the fence besides two sixes, while Morkel needed 63 balls and studded his innings with five boundaries and three sixes.
Zaheer Khan was the pick of Indian bowlers, claiming three for 43 in his 10 overs, while Anil Kumble was his miser self, taking two wickets, conceding 31 runs in his 10 overs.
Munaf's nine overs cost India 63 runs for a wicket, while S Sreesanth gave away 62 runs in 10 overs without any success.
Rest of South Africa 255 for 8 ( J A Rudolph 72 n o, J A Morkel 57, A N Petersen 38, Ashwell Prince 3; Zaheer Khan 3 for 43, Anil Kumble 2 for 31) beat India 218 all out in 49.1 overs (Rahul Dravid 79, Irfan Pathan 34, Mohd Kaif 30; Derryl Steyn 5 for 22, Thomas 2 for 44)